4

SQL Server 2008 R2を使用していますが、ストアドプロシージャは、次のような複数のレベルを持つ構造化XMLを取り込んでいます。

DECLARE @XML xml = 
'<Main>
    <User id="1">
        <Departments isSingle="0">
            <Department id="1">Admin</Department>
            <Department id="2">HR</Department>
            <Department id="3">Development</Department>
        </Departments>
    </User>
    <User id="2">
        <Departments isSingle="1">
            <Department id="1">Admin</Department>            
        </Departments>
    </User>
</Main>'

上記の例から、複数の部門を持つユーザー(isSingle = "0")の2つの列を取得します。最初の列はユーザ​​ーIDで、2番目の列は<Departments>XML全体です。

次のクエリでユーザーIDを取得できますが、DepartmentsセクションをXMLとして取得する方法は次のとおりです。

SELECT
      T.C.value('(../@id)','int') AS UserID
    , T.C.value('(../Departments)[1]','nvarchar(max)') AS DepartmentsXML 
FROM 
@XML.nodes('/Main/User/Departments[@isSingle="0"]') AS T(C)

xml代わりにデータ型として使用することはできませんnvarchar(max)

詳細が不明な場合はお知らせください。改善を試みます。どんな助けでも大歓迎です。

4

1 に答える 1

6

あなたは近くにい.query('.')ます-2番目の列に使用してください:

SELECT
      T.C.value('(../@id)','int') AS UserID, 
      T.C.query('.') AS DepartmentsXML 
FROM 
@XML.nodes('/Main/User/Departments[@isSingle="0"]') AS T(C)

これにより、.nodes()呼び出しで選択されたXMLフラグメントがXMLとして返されます。

于 2012-06-13T18:19:16.853 に答える