如何删除名称在变量中的存储过程?

Sam*_*Sam 2 sql-server stored-procedures t-sql sql-server-2008-r2

给定一个包含存储过程名称的变量:

DECLARE @stored_procedure_name sysname;
SET @stored_procedure_name = 'some_stored_procedure_name';
Run Code Online (Sandbox Code Playgroud)

如何删除存储过程?

Jon*_*gel 9

为此,您必须使用动态 SQL,因为该语句DROP PROCEDURE不能参数化。

顺便说一句,始终对对象名称进行模式限定是一种很好的做法。您没有在问题中指定架构名称(或者说变量包含完整的点分隔名称),所以我已经继续并扩展了您要求包含它的内容。

DECLARE @stored_procedure_schema sysname = NULL;
DECLARE @stored_procedure_name sysname = N'some_stored_procedure_name';

DECLARE @sql nvarchar(MAX) =
    N'DROP PROCEDURE ' +
        ISNULL(QUOTENAME(@stored_procedure_schema) + N'.', N'') +
        QUOTENAME(@stored_procedure_name) + N';';

EXEC(@sql);
Run Code Online (Sandbox Code Playgroud)

这不会在尝试删除该过程之前进行任何检查以查看该过程是否实际存在,因此如果它不存在,您将收到错误消息。sys.procedures用来检查是否存在是微不足道的,所以我没有打扰,你也没有要求它。

要抢先回答您对其他答案的评论,QUOTENAME将正确转义任何对象名称,使其最终被方括号包围。具体来说,是的,这确实处理过程名称本身中的单引号(和方括号)。