我有以下要插入数据库的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)
只插入日期。
有没有办法可以插入两段数据?
答案 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