Исправление ошибки с 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
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. Дополнительная информация об авторе появится вскоре.