MSTSQL:SP return 可以是输出参数还是结果集
MSTSQL: Can a SP return both an out param and a result set
我想知道像这样既有结果集又有输出参数的TSQL存储过程return是否可行。
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 post 中这是可行的。我想在 SQL 服务器中实现相同的目标,尽管限于 2008 版本。
我喜欢使用同一个 SP 来完成它,因为结果集和输出参数都代表我从 XML 文档中读取的信息。因此,SP 的名称以某种方式说明了一切。
编辑
有些人认为它可能与以下内容重复:
Possible to return an out parameter with a DataReader
我认为与 DataReader 的行为方式相关的答案并不比使用 TSQL 实现的方式更多。
事实是我从输出参数中获取了值,但我根本没有从结果集中获取它,它总是 returning null。
所以,我在一个 SQL 纯服务器项目上,我需要它。否则,我会一分为二,如果我不能及时实现它。
使用方法如下:
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
以下是使用输出参数和结果集的简单演示。尝试 运行 几次,结果应该会有所不同。
create procedure Arthur( @TheAnswer as Int Output ) as
begin
-- Set the value of the output parameter.
set @TheAnswer = 42;
-- Generate a single row most of the time.
select GetDate() as NextVogonPoetryReading
where DatePart( millisecond, GetDate() ) < 750;
end;
go 1
-- Declare the variables for the test.
declare @HHGTTU as Table ( HHGTTUId Int Identity, NextVogonPoetryReading DateTime );
declare @SixTimesNine as Int;
-- Execute the SP once so that the while loop might.
insert into @HHGTTU ( NextVogonPoetryReading )
execute Arthur @TheAnswer = @SixTimesNine Output;
-- See what happens.
while exists ( select Pi() from @HHGTTU )
begin
-- See where we are at.
select @SixTimesNine as SixTimesNine, Max( HHGTTUId ) as MaxHHGTTUId, Max( NextVogonPoetryReading ) as MaxNextVogonPoetryReading
from @HHGTTU;
-- Reset.
delete from @HHGTTU;
set @SixTimesNine = 54;
select @SixTimesNine as SixTimesNineAfterReset;
waitfor delay '00:00:00.100';
-- Execute the SP again.
insert into @HHGTTU ( NextVogonPoetryReading )
execute Arthur @TheAnswer = @SixTimesNine Output;
end;
旁白:对于我提到 DataReader
给您的生活带来的创伤,我深表歉意。我只是试图传递我在 C# 应用程序中的经验,而没有深入了解您正在使用哪种类型的数据库连接,可能涉及哪些驱动程序,......
我想知道像这样既有结果集又有输出参数的TSQL存储过程return是否可行。
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 post 中这是可行的。我想在 SQL 服务器中实现相同的目标,尽管限于 2008 版本。
我喜欢使用同一个 SP 来完成它,因为结果集和输出参数都代表我从 XML 文档中读取的信息。因此,SP 的名称以某种方式说明了一切。
编辑
有些人认为它可能与以下内容重复:
Possible to return an out parameter with a DataReader
我认为与 DataReader 的行为方式相关的答案并不比使用 TSQL 实现的方式更多。
事实是我从输出参数中获取了值,但我根本没有从结果集中获取它,它总是 returning null。
所以,我在一个 SQL 纯服务器项目上,我需要它。否则,我会一分为二,如果我不能及时实现它。
使用方法如下:
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
以下是使用输出参数和结果集的简单演示。尝试 运行 几次,结果应该会有所不同。
create procedure Arthur( @TheAnswer as Int Output ) as
begin
-- Set the value of the output parameter.
set @TheAnswer = 42;
-- Generate a single row most of the time.
select GetDate() as NextVogonPoetryReading
where DatePart( millisecond, GetDate() ) < 750;
end;
go 1
-- Declare the variables for the test.
declare @HHGTTU as Table ( HHGTTUId Int Identity, NextVogonPoetryReading DateTime );
declare @SixTimesNine as Int;
-- Execute the SP once so that the while loop might.
insert into @HHGTTU ( NextVogonPoetryReading )
execute Arthur @TheAnswer = @SixTimesNine Output;
-- See what happens.
while exists ( select Pi() from @HHGTTU )
begin
-- See where we are at.
select @SixTimesNine as SixTimesNine, Max( HHGTTUId ) as MaxHHGTTUId, Max( NextVogonPoetryReading ) as MaxNextVogonPoetryReading
from @HHGTTU;
-- Reset.
delete from @HHGTTU;
set @SixTimesNine = 54;
select @SixTimesNine as SixTimesNineAfterReset;
waitfor delay '00:00:00.100';
-- Execute the SP again.
insert into @HHGTTU ( NextVogonPoetryReading )
execute Arthur @TheAnswer = @SixTimesNine Output;
end;
旁白:对于我提到 DataReader
给您的生活带来的创伤,我深表歉意。我只是试图传递我在 C# 应用程序中的经验,而没有深入了解您正在使用哪种类型的数据库连接,可能涉及哪些驱动程序,......