2012-07-11 176 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