Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用T-SQL从存储过程返回xml_C#_Sql_Xml_Stored Procedures_Sql Server 2012 - Fatal编程技术网

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

C# 如何使用T-SQL从存储过程返回xml,c#,sql,xml,stored-procedures,sql-server-2012,C#,Sql,Xml,Stored Procedures,Sql Server 2012,我调用了一个存储过程来返回c应用程序中的数据。我的问题是这个存储过程中有3条SELECT语句。我需要从列中获取所有值。从昨天的报告中,我得出结论,xml是一条可以获得结果的道路。我唯一的问题是,我不确定这在我发现他只是声明@xml的情况下是如何工作的。那没用。该示例使用xml作为输出参数。那么,如何使用存储过程中的xml输出参数返回值呢?我在下面贴了代码。提前谢谢你,我会尽力回答你的所有问题。如果您对如何实现能够阅读c语言中所有3条SELECT语句的目标有任何其他建议,我欢迎您的输入 ALTER

我调用了一个存储过程来返回c应用程序中的数据。我的问题是这个存储过程中有3条SELECT语句。我需要从列中获取所有值。从昨天的报告中,我得出结论,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
结束狂欢


然后使用,这里是一个关于

的例子,是什么让您相信XML是实现这一点的方法?为什么不合并你的数据,或者使用三个单独的存储过程?@AdmiralAdama我的帖子上有链接,昨天在我的问题中,这个人也提到了我。我希望联合数据,但我的三个数据中有两个是同一类型的,另一个不是。我考虑了三种不同的存储过程,但对于一个答案,我会有12种不同的存储过程。这不是很有效。好的,当你在服务器上运行SQL时,@XML中有什么东西吗?还是它是空的?@AdmiralAdama我想在你返回输出值之前它是空的。你能在SQL服务器上运行SQL吗?并测试XML是否包含任何内容?您可能需要使用“我很感激您的回答”,我将返回并稍后重试,但现在只需拆分存储过程。没时间玩了。