我创建了一个存储过程,如果表存在于数据库中,它将删除该表。使用EXEC运行存储过程时,出现以下错误:
Msg 203,Level 16,State 2,Procedure sp_DropIfExists,第13行名称'IF EXISTS(从sys.objects WHERE中选择1 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
答案 0 :(得分:9)
答案 1 :(得分:4)
--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'
答案 2 :(得分:3)
不确定这是否能解决您的问题,但您最好还是检查是否是这样的功能
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]
试试这个,如果您仍然遇到同样的错误,请告诉我。
答案 3 :(得分:2)
EXEC @SQL
应为EXEC (@SQL)
。 (但@maycil的建议也是正确的。)
结果是,没有括号@SQL
的值被解释为要执行的存储过程的名称,而不是脚本。 (之前我不知道,但我做了一个小测试,以确认它确实如此。)