首页 > 解决方案 > 如果存储过程尚不存在,则创建它,但不要更改也不要删除现有的存储过程

问题描述

我找到了一些示例,其中存储过程被删除或更改以防万一它存在。

但是我如何编写一个严格执行以下操作的 T-SQL 批处理脚本:

?

标签: sql-servertsql

解决方案


创建存储过程时,它可以是批处理中的唯一语句。这意味着像下面这样的事情将失败:

IF NOT EXISTS(SELECT 1 FROM sys.schemas s JOIN sys.procedures p ON s.schema_id = p.schema_id WHERE s.[name] = N'dbo' AND p.[name] = N'YourProcedure') BEGIN

    CREATE PROC dbo.YourProcedure @TableName sysname AS
    BEGIN

        SELECT *
        FROM sys.tables t
        WHERE t.name = @TableName;

    END;
END;

因此,如果要先检查过程是否存在,如果不存在则创建它,则必须使用“动态”SQL(它不是真正的动态,因为其中没有任何动态):

IF NOT EXISTS(SELECT 1 FROM sys.schemas s JOIN sys.procedures p ON s.schema_id = p.schema_id WHERE s.[name] = N'dbo' AND p.[name] = N'YourProcedure') BEGIN

    EXEC sys.sp_executesql N'CREATE PROC dbo.YourProcedure @TableName sysname AS
BEGIN

    SELECT *
    FROM sys.tables t
    WHERE t.name = @TableName;

END;';
END;

这意味着在将存储过程的定义中的任何单引号粘贴到动态语句中时,您需要对其进行转义。


推荐阅读