Хранимая процедура для удаления таблицы
Я создал хранимую процедуру, которая будет удалить таблицу, если она существует в базе данных. При запуске хранимой процедуры с EXEC я получаю следующую ошибку:
Msg 203, Уровень 16, Состояние 2, Процедура sp_DropIfExists, строка 13 имя ' IF Существует(выберите 1 из sys.объекты, где Аргумент object_id = object_id используется(Н'table_name') И type = (N'U')) таблица выпадения [table_name] ' недопустимо идентификатор.
однако, если я скопирую и вставлю T-SQL, который генерируется в Management studio, кажется, работает нормально. Может кто-нибудь объяснить, почему это не действует? Исправление было бы неплохо, но я действительно после того, почему в первую очередь, как было бы хорошо, хотя! Спасибо заранее.
ALTER PROCEDURE [dbo].[sp_DropIfExists](@tableName VARCHAR(255))
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL VARCHAR(MAX);
SET @SQL = 'IF EXISTS(SELECT 1 FROM sys.objects WHERE OBJECT_ID = OBJECT_ID(N''' + @tableName + ''') AND type = (N''U'')) DROP TABLE [' + @tableName + ']'
PRINT @SQL;
EXEC @SQL;
END
4 ответов
можно использовать sp_execute
sp_executesql @SQL
для получения дополнительной информации ссылка на документ msdn
--ALTER (if procedure exists)
CREATE PROCEDURE sp_dropifexists (@tableName VARCHAR(255))
AS
BEGIN
DECLARE @SQL VARCHAR(MAX);
SET @SQL = 'IF EXISTS(SELECT 1 FROM sys.objects WHERE OBJECT_ID = OBJECT_ID(N''' + @tableName + ''') AND type = (N''U'')) DROP TABLE [' + @tableName + ']'
--if write EXEC @SQL without parentheses sql says Error: is not a valid identifier
EXEC (@SQL);
END
--test procedure
exec sp_DropIfExists 'table'
не уверен, что это решит ваши проблемы, но вам было бы лучше, если бы вы проверили, что это такая функция
CREATE FUNCTION [dbo].[TableExists]
(
@TableName VarChar(100)
)
RETURNS BIT
AS
BEGIN
DECLARE @TableExists BIT
IF EXISTS(SELECT name FROM sysobjects a
WHERE a.name = @TableName
AND a.xtype = 'U')
SET @TableExists = 1
ELSE
SET @TableExists = 0
RETURN @TableExists
END
затем вы можете использовать его следующим образом.
IF dbo.TableExists('[table_name]') = 1
DROP TABLE [table_name]
попробуйте это и дайте мне знать, если вы все еще получаете ту же ошибку.
EXEC @SQL
должно быть EXEC (@SQL)
. (Но @maycil - это правильно.)
получается, без скобок интерпретируется как имя хранимой процедуры для выполнения, а не как сценарий. (Я не знал этого раньше, но я сделал небольшой тест, чтобы убедиться, что это действительно так.)