Хранимая процедура для удаления таблицы

Я создал хранимую процедуру, которая будет удалить таблицу, если она существует в базе данных. При запуске хранимой процедуры с 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 - это правильно.)

получается, без скобок интерпретируется как имя хранимой процедуры для выполнения, а не как сценарий. (Я не знал этого раньше, но я сделал небольшой тест, чтобы убедиться, что это действительно так.)