让我们想象一下,我们有一个存储过程
CREATE PROCEDURE [dbo].[do_some_magic]
@text nvarchar(100)
AS
BEGIN
-- procedure body
END
现在我们需要将参数@text
数据类型从nvarchar(100)
更改为nvarchar(2000)
。不应更改程序正文。
如何在不将整个过程体放入alter
SQL语句的情况下执行此操作?
ALTER PROCEDURE [dbo].[do_some_magic]
@text nvarchar(2000)
-- can we omit following part?
AS
BEGIN
-- procedure body
END
答案 0 :(得分:2)
您可以尝试保留当前正文的动态SQL解决方案,只更改您需要的部分。这样的事情:(取决于存储过程体的方式,您可能需要更加聪明地使用replace
以避免无意中更改其他内容)
declare @alter nvarchar(max)
SELECT @alter = ROUTINE_DEFINITION
FROM [INFORMATION_SCHEMA].[ROUTINES] as r
WHERE r.ROUTINE_NAME = 'do_some_magic'
AND r.ROUTINE_SCHEMA = 'dbo'
SET @alter = replace(replace(@alter,
'CREATE PROCEDURE','ALTER PROCEDURE'),
'@text nvarchar(100)','@text nvarchar(2000)')
exec (@alter)