将XML导入到未导入的SQL Server 2005数据中
我有一个标题为Code的表,其中包含两个字段,ID和代码。将XML导入到未导入的SQL Server 2005数据中
我有一个XML文件:
<DataSet>
<scan>
<ID>4</ID>
<Code>420</Code>
</scan>
<scan>
<ID>5</ID>
<Code>420</Code>
</scan>
<scan>
<ID>6</ID>
<Code>420</Code>
</scan>
<scan>
<ID>4</ID>
<Code>420</Code>
</scan>
<scan>
<ID>5</ID>
<Code>420</Code>
</scan>
</DataSet>
和正在使用该
INSERT INTO code (id,code)
SELECT X.scan.query('id').value('.','INT'),
X.scan.query('code').value('.','VARCHAR(30)')
FROM (
SELECT CAST(x AS XML)
FROM OPENROWSET(
BULK 'C:\dataimport.xml',
SINGLE_BLOB) AS T(x)
) AS T(x)
CROSS APPLY x.nodes('dataset/scan') AS X(scan);
查询无差错运行,但没有数据被插入到代码表。 我看不到我在想什么。
感谢您的帮助。
XML在SQL Server中区分大小写。
试试这个:
INSERT INTO code (id,code)
SELECT X.scan.query('ID').value('.','INT'),
X.scan.query('Code').value('.','VARCHAR(30)')
FROM (
SELECT CAST(x AS XML)
FROM OPENROWSET(
BULK 'C:\dataimport.xml',
SINGLE_BLOB) AS T(x)
) AS T(x)
CROSS APPLY x.nodes('DataSet/scan') AS X(scan);
使用本地SQL Server 2005的XML支持 - 这样的事情应该工作:
DECLARE @input XML
SELECT @input = CAST(x AS XML)
FROM OPENROWSET(BULK 'C:\dataimport.xml', SINGLE_BLOB) AS T(x)
INSERT INTO Code(ID, Code)
SELECT
Scan.value('(ID)[1]', 'int'),
Scan.value('(Code)[1]', 'varchar(30)')
FROM @input.nodes('/DataSet/scan') AS Tbl(Scan)
你固定的问题,但没有提到的问题是什么。为更好看,可能更好的执行查询+1。 – 2012-07-11 07:29:17
@MikaelEriksson:我想这是因为XPath表达式'.nodes('dataset/scan')'没有注意字符串的**外壳** - 它应该是'.nodes('DataSet/scan' )'在XML中 - 但这只是一个猜测...... :-) – 2012-07-11 08:20:19
感谢您的指导和帮助。知道当我得到相同的结果时我知道要寻找什么。 – Stan 2012-07-11 13:18:14
查询的.nodes()部分是否仅区分大小写?我在其他领域测试了区分大小写,这个案例似乎并不重要。我将scan.query更改为Scan.query,它工作正常。我认为.nodes('DataSet/scan')需要匹配XML中节点的大小写。那是对的吗?谢谢 – Stan 2012-07-11 13:37:22
这是区分大小写的xPath表达式。您在节点,查询和值中使用的字符串。 – 2012-07-11 13:39:47