1

データベースに挿入したい次のxmlがあります

<latestjourneys>
    <journey>
        <startLocation>London</startLocation>
        <endLocation>manchester</endLocation>
        <leavingDay>
             <mon>Yes</mon>
             <tue>No</tue>
        </leavingday>
    <journey>
    <journey>
        <startLocation>Liverpool</startLocation>
        <endLocation>Cardiff</endLocation>
        <leavingDay>
             <mon>Yes</mon>
             <tue>No</tue>
        </leavingday>
    <journey>
</latestjourneys>

次のSQLを使用しています

INSERT INTO test (startLocation,endLocation,mon,tue)
SELECT 
X.product.query('startLocation').value('.', 'VARCHAR(255)'),
X.product.query('endLocation').value('.', 'VARCHAR(255)'),
X.product.query('Mon').value('.', 'VARCHAR(255)'),
X.product.query('Tue').value('.', 'VARCHAR(255)')
FROM (
SELECT CAST(x AS XML)
 FROM OPENROWSET(
 BULK '#fileLocation#',
 SINGLE_BLOB) AS T(x)
) AS T(x)
 CROSS APPLY x.nodes('latestjourneys/journey') AS X(product)

このコードを使用すると、startLocation と endLocation のみが挿入されます。CROSS APPLY を

CROSS APPLY x.nodes('latestjourneys/journey/leavingDay') AS X(product)

日だけが挿入されます。

両方のデータを挿入する方法はありますか?

4

3 に答える 3

1

SQL Server 2005 以降を使用している場合は、次のようなものを使用できます。

SELECT
    StartLocation = Journey.value('(startLocation)[1]', 'varchar(50)'),
    EndLocation = Journey.value('(endLocation)[1]', 'varchar(50)'),
    LeaveMon = Leaving.value('(mon)[1]', 'varchar(10)'),
    LeaveTue = Leaving.value('(tue)[1]', 'varchar(10)')
FROM
    X.nodes('/latestjourneys/journey') AS Nodes(Journey)
CROSS APPLY
    Journey.nodes('leavingDay') AS Subnode(Leaving)

基本的に、最初の.nodes()呼び出しですべての要素のリストが得られます。次に、それらの各要素から再度呼び出して、サブノード内のすべての要素を取得<journey>する必要があります。.nodes()<leavingDay>

于 2012-05-10T12:42:45.887 に答える
-1

うーん..値関数はXPath式を使用してノードの値を返すと思ったので、次のようなことをするかもしれません:

X.product.value('/latestjourneys/journey/leavingDay')

私は SQL の XML サポートにあまり詳しくありませんが、これが役に立てば幸いです。

確認することもできます: http://msdn.microsoft.com/en-us/library/ms345117%28v=sql.90%29.aspx

于 2012-05-10T12:37:03.283 に答える