如何将参数添加到 SQL 服务器中的现有存储过程

How to add a parameter to an existing stored procedure in SQL Server

我想向现有存储过程添加新参数。此过程的主体可能已由用户自定义,因此我无法删除并重新创建它。我不需要修改正文,只需修改签名即可。

所以我想自己替换最后一个现有参数+新参数。

replace(OBJECT_DEFINITION (OBJECT_ID(id)),'@last_param varchar(max)=null','@last_param varchar(max)=null, @new_param varchar(max)=null')

如果找到以下字符串就可以正常工作

@last_param varchar(max)=null

但如果字符串中有空格则不起作用。

我想使用正则表达式来确保它在所有情况下都能正常工作,但我不确定它在 SQL 服务器中是否可行。

你能帮帮我吗?

谢谢

SQL 服务器本身不支持正则表达式。您将不得不使用可用的 string functions 查看更多手动字符串分析。像这样:

set @obDef = OBJECT_DEFINITION(OBJECT_ID(id))
set @startLastParam = PATINDEX('%@last_param%varchar%(%max%)%=%null%', @obDef)
if @startLastParam = 0 begin
    -- handle lastParam not found
end else begin
    set @endLastParam = CHARINDEX('null', @obDef, @startLastParam) + 4 -- 4 = len('null')
    set @newDef = STUFF(@obDef, @endLastParam, 0, ', @new_param varchar(max)=null')
end

虽然这不是很 fool-proof/safe。 PATINDEX() 只给你相同的 % 通配符,你从 LIKE 知道它可能不匹配任何字符,它可能匹配存储过程的一半以在完全外部的某个地方找到单词 max签名。

所以不要只是 运行 在您的客户生产中 ;) 但是如果您确定当前存储过程签名,这可能就可以解决问题给你。