Sql 从不存在行的XML显式子查询返回NULL

Sql 从不存在行的XML显式子查询返回NULL,sql,xml,tsql,sql-server-2005,Sql,Xml,Tsql,Sql Server 2005,这可能很简单,但我在这上面放了个屁 我将使用FOR XML EXPLICIT作为子查询的一部分,以便明确定义返回的XML的格式。因此,我使用UNION ALL来定义该格式 这工作正常,但如果子查询中没有行,我需要它返回NULL。。。此时它返回一个空的根元素:。这是因为我需要定义的第一行 这是TSQL的当前版本 SELECT P.[PROJECTID], P.[PROJECTNAME], ( SELECT * FROM (

这可能很简单,但我在这上面放了个屁

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

这工作正常,但如果子查询中没有行,我需要它返回
NULL
。。。此时它返回一个空的根元素:
。这是因为我需要定义的第一行

这是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

试试这个代码

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:

试试这段代码

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:

+1表示大脑放屁,哦,还有你对问题的描述。如果我不确定如何将
案例集成到@Viji中,你可以使用案例,你能给出一个例子作为答案吗?或者修改?嗨,我已经包含了答案,请检查。+1表示大脑放屁,哦,以及你对问题的描述。如果子句我不确定如何将
案例集成到@Viji中,你可以使用案例,你能举个例子作为答案吗?或者更改?嗨,我已经包括了答案,请检查。