如何使用T-SQL从存储过程返回xml

本文关键字:返回 xml 存储过程 何使用 T-SQL | 更新日期: 2023-09-27 18:01:52

我调用了一个存储过程来返回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

如何使用T-SQL从存储过程返回xml

我认为你需要删除这些最后的行

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