1

这可能很简单,但我对这个有一个脑子放屁......

我将FOR XML EXPLICIT其用作子查询的一部分,以便可以显式定义返回的 XML 的格式。因此我UNION ALL用来定义该格式。

NULL这工作正常,但如果该子查询中没有行,我需要它返回......目前它正在返回一个空的根元素: <codes/>。那是因为我需要定义的第一行。

这是一个 sqlfiddlecom,下面的所有内容供您查看。

这是 TSQL 的一个版本,因为它目前是......

SELECT
    P.[PROJECTID],
    P.[PROJECTNAME],
    (   SELECT *
        FROM (
                SELECT
                    1 AS TAG,
                    NULL AS PARENT,
                    NULL AS 'codes!1',
                    NULL AS 'code!2!!element',
                    NULL AS 'code!2!split'
                UNION ALL
                SELECT
                    2 AS TAG,
                    1 AS PARENT,
                    NULL,                   
                    C.[CODE],
                    C.[SPLIT]
                FROM [CODES] C
                WHERE C.[PROJECTID] = P.[PROJECTID]
             ) AS [CODEXMLDATA]
        FOR XML EXPLICIT
    ) AS [CODESXML]
FROM [PROJECTS] P

示例数据将沿着

PROJECTS table
PROJECTID PROJECTNAME
1         This
2         That
3         Other

CODES table
PROJECTID CODE SPLIT
1         ABC  45
1         BCD  65
2         CDE  100

结果出来了...

PROJECTID PROJECTNAME CODESXML
1         This        <codes><code split="45">ABC</code><code split="55">BCD</code></codes>
2         That        <codes><code split="100">CDE</code></codes>
3         Other       <codes/>

我需要的结果是(注意NULL第 3 行)...

PROJECTID PROJECTNAME CODESXML
1         This        <codes><code split="45">ABC</code><code split="55">BCD</code></codes>
2         That        <codes><code split="100">CDE</code></codes>
3         Other       NULL

NULL任何人都可以给我一个提示,如果没有,我该如何让它返回CODES

4

1 回答 1

1

试试这个代码

SELECT distinct 
    P.[PROJECTID],
    P.[PROJECTNAME],
    case when (p.projectid = c.projectid) then 
    (   SELECT *
        FROM (
                SELECT
                    1 AS TAG,
                    NULL AS PARENT,
                    NULL AS 'codes!1',
                    NULL AS 'code!2!!element',
                    NULL AS 'code!2!split'
                UNION ALL
                SELECT
                    2 AS TAG,
                    1 AS PARENT,
                    NULL,                   
                    C.[CODE],
                    C.[SPLIT]
                FROM [CODES] C
                WHERE C.[PROJECTID] = P.[PROJECTID]
             ) AS [CODEXMLDATA]
        FOR XML EXPLICIT
    ) else null end AS [CODESXML]
FROM [PROJECTS] P
left join [CODES] C on  C.[PROJECTID] = P.[PROJECTID]

SQLFiddle:http ://sqlfiddle.com/#!3/f8788/7/0

于 2013-09-19T20:18:18.300 回答