Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不更改SQL过程主体的情况下更改SQL过程参数的数据类型_Sql_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

如何在不更改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)