如果存储过程尚不存在,则创建存储过程,但不要更改也不删除现有存储过程



我发现了一些示例,其中存储过程在存在的情况下被删除或更改。

但是,如何编写严格执行以下操作的 T-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
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;

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

最新更新