2015-09-01 54 views
0

我努力修改某些SQL生成的XML。从SQL生成XML nil ='true'

下面的示例代码生成3行输出,前2个是正确的,但是,我需要第三个渲染出xsi:nil = true的根元素。

非常感谢。

CREATE TABLE #ReportPackComparativeIndices 
(
    ReportPackRequestID INT, 
    IndexDescription VARCHAR(250), 
    Value DECIMAL(18,1) 
) 

INSERT INTO #ReportPackComparativeIndices VALUES (25984, 'ClientIndexID0', 28.3) 
INSERT INTO #ReportPackComparativeIndices VALUES (25984, 'ClientIndexID1', 43.5) 
INSERT INTO #ReportPackComparativeIndices VALUES (25984, 'ClientIndexID2', 81.1) 
INSERT INTO #ReportPackComparativeIndices VALUES (25984, 'ClientIndexID3', 24.5) 
INSERT INTO #ReportPackComparativeIndices VALUES (25985, 'ClientIndexID0', 93.9) 
INSERT INTO #ReportPackComparativeIndices VALUES (25985, 'ClientIndexID1', 53.8) 
INSERT INTO #ReportPackComparativeIndices VALUES (25985, 'ClientIndexID2', 69.3) 
INSERT INTO #ReportPackComparativeIndices VALUES (25985, 'ClientIndexID3', 26.8) 
INSERT INTO #ReportPackComparativeIndices VALUES (25986, NULL, NULL) 

SELECT * FROM #ReportPackComparativeIndices 


-- Render out the XML Fragments 
SELECT ti.ReportPackRequestID, 
CAST(
(
    SELECT 
     ti2.IndexDescription, 
     ti2.Value 
    FROM 
     #ReportPackComparativeIndices AS ti2 
    WHERE 
     ti.ReportPackRequestID = ti2.ReportPackRequestID 
    FOR XML PATH('ComparisonValue'), 
     ROOT('ComparativeInvestments'), 
     ELEMENTS, 
     TYPE 
) AS NVARCHAR(MAX)) AS XmlFragment 
FROM 
    #ReportPackComparativeIndices AS ti 
    GROUP BY 
     ti.ReportPackRequestID 
    ORDER BY 
     ti.ReportPackRequestID 
+0

首先打谷歌我们/库/ bb510413%28V = sql.120%29.aspx)。第二次谷歌命中:[用XSINIL参数生成NULL值元素](https://msdn.microsoft.com/en-us/library/ms178079%28v=sql.120%29.aspx)。 – GSerg

+0

感谢您花时间回复,但是,这两个页面都不能回答我问的问题。添加XSINIL参数到ELEMENTS指令设置内部元素'IndexDescription'和'Value''xsi:nil =“true”',而不是根元素'ComparativeInvestments' – Jonnie

回答

2

刚将XSINIL添加到您的ELEMENTS中。这是缺少的吗?

编辑:有了这一招,你可以创建一个XSI:零上一级,如果这两个元素是空的,但我宁愿去想设计...

SELECT ti.ReportPackRequestID, 
CAST(
(
    SELECT 
     CASE WHEN ti2.IndexDescription IS NULL AND ti2.Value IS NULL THEN 'true' ELSE NULL END AS [@xsi:nil], 
     ti2.IndexDescription, 
     ti2.Value 
    FROM 
     #ReportPackComparativeIndices AS ti2 
    WHERE 
     ti.ReportPackRequestID = ti2.ReportPackRequestID 
    FOR XML PATH('ComparisonValue'), 
     ROOT('ComparativeInvestments'), 
     ELEMENTS XSINIL, 
     TYPE 
) AS NVARCHAR(MAX)) AS XmlFragment 
FROM 
    #ReportPackComparativeIndices AS ti 
    GROUP BY 
     ti.ReportPackRequestID 
    ORDER BY 
     ti.ReportPackRequestID; 

还有一个尝试:

SELECT ti.ReportPackRequestID, 
CAST(
(
    SELECT 
     CASE WHEN ti2.IndexDescription IS NULL AND ti2.Value IS NULL THEN 'true' ELSE NULL END AS [ComparativeInvestments/@xsi:nil], 
     ti2.IndexDescription AS [ComparativeInvestments/ComparisonValue/IndexDescription], 
     ti2.Value AS [ComparativeInvestments/ComparisonValue/Value] 
    FROM 
     #ReportPackComparativeIndices AS ti2 
    WHERE 
     ti.ReportPackRequestID = ti2.ReportPackRequestID 
    FOR XML PATH('dummy'), 
     ELEMENTS XSINIL, 
     TYPE 
) AS NVARCHAR(MAX)) AS XmlFragment 
FROM 
    #ReportPackComparativeIndices AS ti 
    GROUP BY 
     ti.ReportPackRequestID 
    ORDER BY 
     ti.ReportPackRequestID; 
+0

谢谢,但我恐怕不会,这会将IndexDescription和Value设置为的xsi:零,而不是根元素 'ComparativeInvestments':<值xsi:nil =“true”/> Jonnie

+1

@JonathonRalfe,根元素本身是否应该是NULL?我编辑我的答案,但我觉得有什么不对的设计... – Shnugo

+0

感谢@Shnugo,这似乎给我一个很好XSI:无=真上ComparisonValue,而不是根元素ComparisonInvestment上。我了解到,您对根元素非常不空点,但这个位于这是其他地方缝合在一起的SSIS包内,所以是不是真正的根元素,但我的双手被缚。 – Jonnie

1

我最终选择的选项是嵌套两个select语句,丢失了XMLRoot元素,转而将两个单独的XML PATH语句应用于外部(旧根)元素。

SELECT ti.ReportPackRequestID, 
CAST(
(
    SELECT 
    (
     SELECT 
      CASE WHEN ti2.IndexID IS NOT NULL 
       THEN 'ClientIndexID' + CAST(ti2.RowNumber -1 AS VARCHAR(5)) 
       ELSE NULL 
      END AS IndexID, 
      ti2.IndexTotalReturn AS Value 
     FROM 
      #ReportPackComparativeIndices AS ti2 
     WHERE 
      ti.ReportPackRequestID = ti2.ReportPackRequestID 
     ORDER BY 
      ti2.RowNumber 
     FOR XML PATH('ComparisonValue'), 
      ELEMENTS, 
      TYPE 
    ) 
    FOR XML PATH('ComparativeInvestments'), 
     ELEMENTS XSINIL, 
     TYPE 
) AS NVARCHAR(MAX)) AS XmlFragment 
FROM 
    #ReportPackComparativeIndices AS ti 
GROUP BY 
    ti.ReportPackRequestID 
ORDER BY 
    ti.ReportPackRequestID 

这让我在XML所需的输出:[:指定XSINIL与ELEMENTS指令实施例:(https://msdn.microsoft.com/en-

<ComparativeInvestments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>