【问题标题】:SQL SERVER FOR XML EXPLICIT用于 XML 显式的 SQL 服务器
【发布时间】:2013-06-03 19:03:54
【问题描述】:

我想将 SELECT FOR XML EXPLICIT 语句的结果分配给 XML 变量,例如

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 子句在视图、内联函数、派生表和包含集合运算符的子查询中无效。要解决此问题,请使用派生表语法包装包含集合运算符的 SELECT,并在其上应用 FOR XML。

【问题讨论】:

  • 请不要对我们大喊大叫!

标签: sql-server xml for-xml-explicit


【解决方案1】:

如果是这样,则不需要@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

【讨论】:

  • 我将从 SSIS 包执行 SQL 任务中调用此 SP。我可以将此 SP 的 putput 分配给 SSIS 包中的 XML 变量吗
  • 当然,只需设置 SQL 任务的 Result Set 属性,并像往常一样将其分配给您的变量。 msdn.microsoft.com/en-us/library/ms141689.aspx
【解决方案2】:

错误不是特别清楚,但是说的是不能在内联子查询中使用FOR XML子句,因为它包含一个UNION(一种集合运算符)

建议的解决方法是将子查询包装在其他东西中并单独调用它,例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 2018-11-15
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多