[英]How to return xml from a stored procedure using T-SQL
我有一个存储过程,可以调用该过程在c#应用程序中返回数据。 我的问题是在此存储过程中有3个SELECT
语句。 我需要从列中获取所有值。 从昨天的帖子中,我得出结论认为xml是行之有效的方法,这样我就可以得到我的结果。 我唯一的问题是,在我发现他只是声明@xml xml
的示例中 ,我不确定这是如何工作的。 那什么也没做。 该示例使用xml作为输出参数。 那么如何使用存储过程中的xml输出参数返回值呢? 我已经在下面发布了代码。 预先谢谢您,我将尽力回答您的所有问题。 如果您对如何实现能够读取c#中的所有3条SELECT语句的目标还有其他建议,我欢迎您进行输入。
ALTER PROCEDURE [dbo].[L_DownTimeByLine]
@startTime datetime,
@endTime datetime,
@line int,
@xml xml output
DECLARE @QueryA nvarchar(MAX);
DECLARE @QueryB nvarchar(MAX);
DECLARE @ParamsA nvarchar(500);
DECLARE @ParamsB nvarchar(500);
SET @QueryA = N'
select min(DateAndTime) as FaultStart, max(DateAndTime) as FaultEnd, cast(max(DateAndTime) - min(DateAndTime) as time) as DownTime
from (select pt.*,
sum(case when datediff(second, prevdt, DateAndTime) <= 1 then 0 else 1 end) over
(order by DateAndTime) as grp
from (select pt.*, lag(DateAndTime) over (order by DateAndTime) as prevdt
from IncomingProductTracker pt
where ' + @lineAvariable + ' = 1 and
DateAndTime > @startTime1 and
DateAndTime < @endTime1
) pt
) pt
group by grp
having cast(max(DateAndTime) - min(DateAndTime) as time) < @breakAllowance1
order by FaultStart';
SET @ParamsA = N'@startTime1 datetime, @endTime1 datetime, @breakAllowance1 time(0)';
SET @QueryB = N'
select min(DateAndTime) as FaultStart, max(DateAndTime) as FaultEnd, cast(max(DateAndTime) - min(DateAndTime) as time) as DownTime
from (select pt.*,
sum(case when datediff(second, prevdt, DateAndTime) <= 1 then 0 else 1 end) over
(order by DateAndTime) as grp
from (select pt.*, lag(DateAndTime) over (order by DateAndTime) as prevdt
from IncomingProductTracker pt
where ' + @lineBvariable + ' = 1 and
DateAndTime > @startTime1 and
DateAndTime < @endTime1
) pt
) pt
group by grp
having cast(max(DateAndTime) - min(DateAndTime) as time) < @breakAllowance1
order by FaultStart';
SET @ParamsB = N'@startTime1 datetime, @endTime1 datetime, @breakAllowance1 time(0)';
declare @tempA table (
FaultStart datetime,
FaultEnd datetime,
DownTime time(0))
declare @tempB table (
FaultStart datetime,
FaultEnd datetime,
DownTime time(0))
insert into @tempA (FaultStart, FaultEnd, DownTime)
EXEC sp_executesql @QueryA, @ParamsA, @startTime1 = @startTime, @endTime1 = @endTime, @breakAllowance1 = @breakAllowance;
insert into @tempB (FaultStart, FaultEnd, DownTime)
EXEC sp_executesql @QueryB, @ParamsB, @startTime1 = @startTime, @endTime1 = @endTime, @breakAllowance1 = @breakAllowance;
declare @tempAXml xml = (
select FaultStart, FaultEnd, DownTime
from @tempA as A
for xml auto)
declare @tempBXml xml = (
select FaultStart, FaultEnd, DownTime
from @tempB as B
for xml auto)
-- here you build a single XML with all the data required
set @xml =
cast(@tempAXml as nvarchar(max)) +
cast(@tempBXml as nvarchar(max))
select @aLineDownTime as [A Line Down Time], convert(nvarchar, @aLinePercentage) + '%' as [A Line Percentage], @bLineDownTime as [B Line Down Time], convert(nvarchar, @bLinePercentage) + '%' as [B Line Percentage], @totalDownTime as [Total Down Time], convert(nvarchar, @totalPercentage) + '%' as [Total Percentage]
select *
FROM @tempA
select *
FROM @tempB
我认为您需要删除最后几行
select @aLineDownTime as [A Line Down Time], convert(nvarchar, @aLinePercentage) + '%' as [A Line Percentage], @bLineDownTime as [B Line Down Time], convert(nvarchar, @bLinePercentage) + '%' as [B Line Percentage], @totalDownTime as [Total Down Time], convert(nvarchar, @totalPercentage) + '%' as [Total Percentage]
select *
FROM @tempA
select *
FROM @tempB
如果您的输出参数有效,则可能有效,否则您可能需要执行以下操作:
select @xml
结束存储过程。
然后使用ExecuteXmlReader ,这是StackOverflow上的示例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.