【发布时间】:2015-10-06 08:41:49
【问题描述】:
将存储过程的现有参数更改为输出参数是否会对现有代码产生任何影响?
对于上下文,我有一个存储过程,它接受然后修改一个参数,通过选择它返回修改后的参数。 C#调用者通过SqlCommand.ExecuteReader接收返回的参数。
存储过程如下所示:
CREATE procedure UpsertData
@objectid int, --This line would change
...
as
if not exists (select objectid from mytable where objectid = @objectid)
begin
insert into mytable (...) values (...)
set @objectid = (select scope_identity() as int)
end
else
begin
update mytable
set ...
where objectid=@objectid
end
select @objectid
我现在打算在其他存储过程中调用这个存储过程。使用INSERT-EXEC 可以让我避免修改在多个地方使用的UpsertData。
但是,将@objectid int, 替换为@objectid int output, 让我印象深刻。我不确定这是否安全;存储过程在很多地方被调用,所以我担心它可能会以某种意想不到的方式中断。 这是一个合理的担忧吗?
【问题讨论】:
-
是的。使用此过程的任何代码都必须更改。
-
@ZoharPeled:请举例说明在进行此更改后行为会有所不同的代码。我尝试运行与此类存储过程对话的现有代码,并且无论参数是否为输出参数,它都有效。
-
您的意思是保留选择以及将参数更改为输出?
-
那我觉得是安全的。我以为您要更改存储过程并删除选择... AFAIK,sql server 输出参数实际上是输入/输出。
-
@ZoharPeled:你是对的。我做了理智检查,确认此更改不会破坏任何明显的东西,但仍有可能破坏一些微妙的东西。
标签: c# tsql sql-server-2008-r2 output-parameter