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/>

私が必要とする結果は(3行目に注意してくださいNULL)...

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 に答える