Хранимая процедура удаления таблицы - PullRequest
8 голосов
/ 18 мая 2011

Я создал хранимую процедуру, которая удалит таблицу, если она существует в базе данных.При запуске хранимой процедуры с EXEC я получаю следующую ошибку:

Сообщение 203, Уровень 16, Состояние 2, Процедура sp_DropIfExists, Строка 13 Имя 'IF EXISTS (SELECT 1 FROM sys.objects)WHERE OBJECT_ID = OBJECT_ID (N'table_name ') AND type = (N'U')) DROP TABLE [table_name] 'не является допустимым идентификатором.

Однако, если я копирую и вставляюSQL, который генерируется в студии управления, кажется, работает нормально.Может кто-нибудь объяснить, почему это не верно?Исправление было бы неплохо, но я действительно после "Почему прежде всего", "Как бы хорошо, хотя!"Заранее спасибо.

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 ]

9 голосов
/ 18 мая 2011

Вы можете использовать sp_execute

sp_executesql @SQL

для получения дополнительной информации ссылка на документ MSDN

4 голосов
/ 04 октября 2012
--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'
4 голосов
/ 18 мая 2011

Не уверен, что это решит ваши проблемы, но вам лучше поставить чек, как функция

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]

Попробуйте и дайте мне знать, если вы все еще получаете ту же ошибку.

2 голосов
/ 18 мая 2011

EXEC @SQL должно быть EXEC (@SQL). (Но предложение @ maycil тоже верно.)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...