如何在不更改SQL过程主体的情况下更改SQL过程参数的数据类型
假设我们有一个存储过程如何在不更改SQL过程主体的情况下更改SQL过程参数的数据类型,sql,sql-server,tsql,stored-procedures,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)。程序主体不应更改 如何在不将整个过程体放入alterSQL语句的情况下执行此操作 ALTER PROCEDURE [dbo].[do_some_magic] @text nvar
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
您可以尝试一种动态SQL解决方案,它保留当前主体,只更改您需要的部分。类似这样的情况:(取决于存储过程主体的方式,您可能需要更巧妙地使用
replace
,以避免无意中更改其他内容)
我认为那是不可能的。但我很好奇,为什么你不想提供程序体呢?实际上程序体可能会被用户修改。。。此SQL不应破坏它。您需要指定主体,但可以通过获取定义并仅更改预期的部分,使用动态SQL重建主体。这就是你想要的解决方案吗?
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)