SQL,XML插入多个节点

时间:2012-05-10 12:07:39

标签: sql xml insert nodes

我有以下要插入数据库的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)

只插入日期。

有没有办法可以插入两段数据?

3 个答案:

答案 0 :(得分: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>子节点。

答案 1 :(得分:0)

声明@temp表(id int,guid uniqueidentifier)

将@XMlData声明为xml;

设置@XMlData ='将你的xml粘贴到这里'

插入@temp(id,guid)SELECT XTbl.Cats.value('。','int'),newid()FROM @ XMlData.nodes('/ users / user')AS XTbl(Cats)< / p>

从@temp

中选择*

输出:

id guid 10 12FF8543-D98C-4CF3-BA0B-CD4CFEF5A0C3 20 F6244519-F40E-4E28-9C91-5832E7F45A70 30 6775BED5-1127-4D8E-88D2-ECE9CED55056

答案 2 :(得分:-1)

嗯..我认为value函数将使用XPath表达式返回节点的值,所以可能会这样做:

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

我并不熟悉SQL的XML支持,但我希望这会有所帮助。

您还可以查看:http://msdn.microsoft.com/en-us/library/ms345117%28v=sql.90%29.aspx