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 回答
0

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

将@XMlData 声明为 xml;

set @XMlData = '在此处粘贴您的 xml'

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

从 @temp 中选择 *

输出:

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

于 2015-05-21T05:47:04.237 回答
-1

嗯..我认为 value 函数将使用 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 回答