2012-07-11 123 views
0

我有一个标题为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); 

查询无差错运行,但没有数据被插入到代码表。 我看不到我在想什么。

感谢您的帮助。

回答

1

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); 
+0

感谢您的指导和帮助。知道当我得到相同的结果时我知道要寻找什么。 – Stan 2012-07-11 13:18:14

+0

查询的.nodes()部分是否仅区分大小写?我在其他领域测试了区分大小写,这个案例似乎并不重要。我将scan.query更改为Scan.query,它工作正常。我认为.nodes('DataSet/scan')需要匹配XML中节点的大小写。那是对的吗?谢谢 – Stan 2012-07-11 13:37:22

+0

这是区分大小写的xPath表达式。您在节点,查询和值中使用的字符串。 – 2012-07-11 13:39:47

1

使用本地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) 
+0

你固定的问题,但没有提到的问题是什么。为更好看,可能更好的执行查询+1。 – 2012-07-11 07:29:17

+1

@MikaelEriksson:我想这是因为XPath表达式'.nodes('dataset/scan')'没有注意字符串的**外壳** - 它应该是'.nodes('DataSet/scan' )'在XML中 - 但这只是一个猜测...... :-) – 2012-07-11 08:20:19

相关问题