2013-06-03 54 views
0

我想一个SELECT FOR XML显式声明的结果分配给一个XML变量如SQL SERVER FOR XML EXPLICIT

CREATE PROCEDURE BILLING_RESPONSE 
AS DECLARE @Data AS XML 

SET @Data = (SELECT 

       1 AS Tag, 
       NULL AS Parent, 
       NULL AS 'CallTransactions!1!', 
       NULL AS 'TCALTRS!2!TRS_DAT_TE!cdata', 
       NULL AS 'TCALTRS!2!TRS_CRT_DT!Element' 
      UNION ALL 
      SELECT 
       2 AS Tag, 
       1 AS Parent, 
       NULL, 
       TRS_DAT_TE, 
       TRS_CRT_DT 
      FROM TCALTRS 
      WHERE TRS_CRT_DT between CONVERT(date,GETDATE()-1) and CONVERT(date,getdate()) and 
      TRS_DAT_TE like '%(Submit Response)%' 
      FOR XML EXPLICIT   
      ) 

SELECT @DATA 
GO 

当我执行此查询正在以下错误 消息1086,15级,状态1,过程BILLING_RESPONSE,行22 FOR XML子句在包含set运算符时在视图,内联函数,派生表和子查询中无效。要解决此问题,请使用派生表语法来包装包含set操作符的SELECT,然后在其上应用FOR XML。

+1

请不要在我们这里发布! –

回答

0

如果是这样,则不需要@Data变量。让你的sp直接返回查询结果,你就完成了。

CREATE PROCEDURE BILLING_RESPONSE AS 
SELECT 

     1 AS Tag, 
     NULL AS Parent, 
     NULL AS 'CallTransactions!1!', 
     NULL AS 'TCALTRS!2!TRS_DAT_TE!cdata', 
     NULL AS 'TCALTRS!2!TRS_CRT_DT!Element' 
    UNION ALL 
    SELECT 
     2 AS Tag, 
     1 AS Parent, 
     NULL, 
     TRS_DAT_TE, 
     TRS_CRT_DT 
    FROM TCALTRS 
    WHERE TRS_CRT_DT between CONVERT(date,GETDATE()-1) and CONVERT(date,getdate()) and 
    TRS_DAT_TE like '%(Submit Response)%' 
    FOR XML EXPLICIT 
+0

我将从SSIS包执行SQL任务调用此SP。我是否可以将此SP的putput分配给SSIS包中的XML变量 – user2232290

+0

当然,只需设置SQL Task的Result Set属性并像往常一样将其分配给您的变量即可。 http://msdn.microsoft.com/en-us/library/ms141689.aspx – Oscar

0

的错误不是特别清楚,但它的意思是,因为它包含了UNION(一种集合运算符),你不能使用内联子查询FOR XML条款

的建议的解决方法是将子查询包装为其他内容并单独调用它,例如:

CREATE PROCEDURE BILLING_RESPONSE 
AS DECLARE @Data AS XML 

;WITH DATA AS(
       SELECT 
       1 AS Tag, 
       NULL AS Parent, 
       NULL AS 'CallTransactions!1!', 
       NULL AS 'TCALTRS!2!TRS_DAT_TE!cdata', 
       NULL AS 'TCALTRS!2!TRS_CRT_DT!Element' 
      UNION ALL 
      SELECT 
       2 AS Tag, 
       1 AS Parent, 
       NULL, 
       TRS_DAT_TE, 
       TRS_CRT_DT 
      FROM TCALTRS 
      WHERE TRS_CRT_DT between CONVERT(date,GETDATE()-1) and CONVERT(date,getdate()) and 
      TRS_DAT_TE like '%(Submit Response)%' 
      FOR XML EXPLICIT   
      ) 
SELECT @Data = (SELECT * FROM DATA FOR XML EXPLICIT) 
SELECT @DATA 
GO