Исправление ошибки с constraint $ndodefault$*

Сегодня в студии — очередная ошибка, на этот раз связанная с названиями констрэйнтов (на SQL). Выглядит она так:

—————————
Microsoft Business Solutions-Navision
—————————
Произошла следующая ошибка(и) SQL Server при обращении к таблице Purch. Inv. Header:

3728,»42000″,[Microsoft][ODBC SQL Server Driver][SQL Server]’$ndodefault$860319737$66′ is not a constraint.
3727,»42000″,[Microsoft][ODBC SQL Server Driver][SQL Server]Could not drop constraint. See previous errors.

SQL:
ALTER TABLE «work».»dbo».»YOUR COMPANY$Purch__Inv__Header» DROP CONSTRAINT «$ndodefault$860319737$66»
—————————
OK
—————————

Ну а для исправления придется написать SQL-скрипт:

-- Скрипт исправляет ndodefault

DECLARE @Old_Name   VARCHAR(100),
        @New_Name   VARCHAR(100),
        @ParentID   VARCHAR(100),
        @i          INT  

DECLARE Cur_constr CURSOR LOCAL FAST_FORWARD READ_ONLY TYPE_WARNING
FOR
    SELECT [name], CAST ([parent_object_id] AS VARCHAR)
    FROM   [sys].[default_constraints]
    WHERE  NAME LIKE '$ndodefault$%$%'
           AND [is_system_named] = 0
    ORDER BY
           parent_object_id

OPEN  Cur_constr
FETCH NEXT FROM Cur_constr INTO @Old_Name , @ParentID                        
SET @i = 0
DECLARE @SQL_Expr AS nVARCHAR(MAX)
WHILE @@Fetch_Status = 0
      AND @i < 200000
BEGIN
    SET @New_Name = '$ndodefault$' + @ParentID + SUBSTRING(@Old_Name,
    CHARINDEX('$', @Old_Name, 13), LEN(@Old_Name))
    IF @Old_Name <> @New_Name
    BEGIN
        SET @i = @i + 1
        SET @SQL_Expr = ' EXEC sp_rename ' + QUOTENAME(@Old_Name) + ', '
        + QUOTENAME(@New_Name) + '; Print '  + CAST(@i AS nVARCHAR)
        EXEC sp_executeSQL @statement = @SQL_Expr
        --PRINT @SQL_Expr
        --PRINT 'GO'
    END

    FETCH NEXT FROM Cur_constr INTO @Old_Name , @ParentID
END

Автор:

Количество статей, опубликованных автором: 3. Дополнительная информация об авторе появится вскоре.

Добавить комментарий