SQL Сервер: следующая хранимая процедура не работает, но оператор SQL работает вне хранимой процедуры.
CREATE PROCEDURE schema1.dropConstraints
(@schemaName AS nvarchar, @tableName AS nvarchar)
AS
BEGIN
DECLARE @cname nvarchar(80)
DECLARE @sqlStatement nvarchar(100)
DECLARE myCursor CURSOR LOCAL FOR
SELECT constraint_name
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE constraint_schema = @schemaName
AND table_name = @tableName;
OPEN myCursor;
FETCH NEXT FROM myCursor INTO @cname;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sqlStatement = 'ALTER TABLE ' + @schemaName + '.' + @tableName + ' DROP CONSTRAINT ' + @cname;
EXEC sp_executesql @sqlStatement;
FETCH NEXT FROM myCursor INTO @cname;
END;
CLOSE myCursor;
DEALLOCATE myCursor;
END;
Вызов хранимой процедуры
exec schema1.dropConstraints 'schema1', 'Foo';
Таблица Ограничения Foo
(PK, FK) не были удалены. Нет ошибок.
Но если запустить код вне хранимой процедуры, он работает нормально.
DECLARE @schemaName nvarchar(80) = 'schema1';
DECLARE @tableName nvarchar(80) = 'Foo';
DECLARE @cname nvarchar(80)
DECLARE @sqlStatement nvarchar(100)
DECLARE myCursor CURSOR LOCAL FOR
SELECT constraint_name
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE constraint_schema = @schemaName AND table_name = @tableName;
OPEN myCursor;
FETCH NEXT FROM myCursor INTO @cname;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sqlStatement = 'ALTER TABLE ' + @schemaName + '.' + @tableName + ' DROP CONSTRAINT ' + @cname;
EXEC sp_executesql @sqlStatement;
FETCH NEXT FROM myCursor INTO @cname;
END;
CLOSE myCursor;
DEALLOCATE myCursor;
Это работает. Ограничения таблицы Foo
(PK, FK) были удалены. В чем разница?
логин: sa.