如何在不改变其主体的情况下更改SQL过程参数的数据类型

时间:2014-08-27 16:31:44

标签: sql sql-server tsql stored-procedures

让我们想象一下,我们有一个存储过程

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

1 个答案:

答案 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)