2013-06-03 52 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