【发布时间】:2019-07-03 01:49:18
【问题描述】:
我想知道让 TSQL 存储过程同时返回结果集和输出参数是否可行。
create procedure uspReadMyXmlInformation(@myXmlDoc xml, @myProductNum varchar(18) output) as
begin
set nocount on;
declare @myXmlContent table(MyOrderId varchar(12) not null
,CreatedAt datetime not null)
insert into @myXmlContent
select x.c.value('MyOrderID[1]', 'varchar(12)')
x.c.value('CreatedAt[1]', 'datetime')
from @myXmlDoc.nodes('MyRootNodeName/MyChildNodeName') x(c)
set @myProductNum='MyProductNum'
select *
from @myXmlContent
return;
end
所以,这里发生的情况是,我可以在删除输出参数时获得结果集,或者我获得输出参数并且结果集始终为空(0=count(*))。
我是否可以使用相同的存储过程获得两者,或者我最好将它们拆分?
我认为 Oracle 中的这篇文章是可行的。我想在 SQL Server 中实现同样的功能,但仅限于 2008 版本。
Oracle stored procedure: return both result set and out parameters
我喜欢使用同一个 SP 的原因是结果集和输出参数都代表了我从 XML 文档中读取的信息。所以,不知何故,SP 的名称说明了一切。
编辑
有些人认为它可能与以下内容重复:
Possible to return an out parameter with a DataReader
我不认为这与 DataReader 的行为方式相关的答案比 TSQL 的实现方式更重要。
事实是我从输出参数中得到了值,但我根本没有从结果集中得到它,它总是返回 null。
所以,我正在进行一个仅 SQL Server 的项目,我需要它。否则,如果不能及时实现,我就一分为二。
它的使用方法如下:
declare @xmlInformationData table(MyOrderId varchar(12) not null
,CreatedAt datetime not null)
insert into @xmlInformationData
execute uspReadMyXmlInformation @myXmlDoc, @myProductNum output
while 0<(select count(*) from @xmlInformationData)
begin
-- This will never be executed because I have no rows in @xmlInformationData
-- And yet, before the loop, I have my out param value!
end
【问题讨论】:
-
您可以同时拥有两者,但输出参数可能会“延迟”填充,例如在 .NET 应用程序中关闭
DataReader后。 -
正如@HABO 所说,您可以同时拥有两者,但
out变量通常仅在处理完最后一个结果集后才可用。 -
其实根本没有DataReader!我不知道你们在哪里看到了 C# 标签之类的东西,但是没有!这是一个仅限 SQL Server 的项目,因为该数据库的目的是用作数据交换。因此,它从一边到另一边读取数据并推送信息。所以,周围没有 C# 代码!所以现在,我获得了输出参数值,但我从来没有获得结果集数据。而我两者都需要。有人可以帮忙吗?
-
@WillMarcouiller 您描述的问题通常发生在远程调用服务器时,这不是
DataReader的问题,而是由于用于与 SQL Server 通信的 TDS 协议的性质。当我在服务器 see screenshot 上运行查询时,我无法重现您的问题。
标签: tsql sql-server-2008 stored-procedures resultset output-parameter