我正在努力修改一些SQL生成的XML。
以下示例代码生成3行输出,前2个是正确的,但是,我需要第3个渲染到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 :(得分:2)
刚刚将XSINIL添加到您的ELEMENTS中。这是缺少的吗?
编辑:使用这个技巧你可以在上面创建一个xsi:nil,如果两个元素都是NULL,但我宁愿考虑设计...... 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;
答案 1 :(得分:1)
我最终选择的选项是嵌套两个选择语句,丢失XMLRoot元素,转而使用两个单独的XML PATH语句,将XSINIL应用于外部(旧根)元素。
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中所需的输出:
<ComparativeInvestments xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>