[英]Stored procedure to drop table
我創建了一個存儲過程,如果表存在於數據庫中,它將刪除該表。 使用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 ]'不是有效的標識符。
但是,如果我將生成的T-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
--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的建議也是正確的。)
事實證明,沒有括號@SQL
的值被解釋為要執行的存儲過程的名稱,而不是腳本。 (之前我不知道,但我做了一個小測試,以確認確實如此。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.