简体   繁体   English

删除表的存储过程

[英]Stored procedure to drop table

I have created a stored procedure that will drop a table if it exists in a database. 我创建了一个存储过程,如果表存在于数据库中,它将删除该表。 When running the stored procedure with EXEC, I am getting the following error: 使用EXEC运行存储过程时,我收到以下错误:

Msg 203, Level 16, State 2, Procedure sp_DropIfExists, Line 13 The name 'IF EXISTS(SELECT 1 FROM sys.objects WHERE OBJECT_ID = OBJECT_ID(N'table_name') AND type = (N'U')) DROP TABLE [table_name]' is not a valid identifier. 消息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 ]'不是有效的标识符。

However if i copy and paste the T-SQL that is generated into management studio, it seems to be running fine. 但是,如果我将生成的T-SQL复制并粘贴到管理工作室,它似乎运行正常。 Can someone explain why this is not valid? 有人能解释为什么这是无效的吗? The fix would be nice, but I am really after the Why primarily, The How would be nice to though! 修复会很好,但我真的是在主要为什么之后,尽管如此会更好! Thanks in advance. 提前致谢。

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

you can use sp_execute 你可以使用sp_execute

sp_executesql @SQL

for more information msdn document link 有关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'

Not sure if this will solve your problems but you would be better placing you check is a function like so 不确定这是否能解决您的问题,但您最好放置检查功能就是这样

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

Then you can use it as follows. 然后你可以按如下方式使用它。

IF dbo.TableExists('[table_name]') = 1
     DROP TABLE [table_name]

Try this and let me know if you still get the same error. 试试这个,如果你仍然得到同样的错误,请告诉我。

EXEC @SQL should be EXEC (@SQL) . EXEC @SQL应该是EXEC (@SQL) (But @maycil 's suggestion is correct too.) (但@maycil的建议也是正确的。)

Turns out, without the parentheses @SQL 's value is interpreted as the name of a stored procedure to execute, not as a script. 事实证明,没有括号@SQL的值被解释为要执行的存储过程的名称,而不是脚本。 (I didn't know that before, but I made a small test to verify that it is indeed so.) (之前我不知道,但我做了一个小测试,以确认确实如此。)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM