2014-11-04 115 views
2

對不起,有關此主題的更多文章,但我絕望地試圖將這個XML導入到數據庫沒有任何成功。 這是XML:將XML導入到SQL

<session xmlns="http://winscp.net/schema/session/1.0" start="2014-11-03T17:23:22.376Z"> 
    <ls> 
    <destination value="/Output" /> 
    <files> 
     <file> 
     <filename value="." /> 
     <type value="d" /> 
     <modification value="2014-11-03T12:17:58.000Z" /> 
     <permissions value="rwxr-sr-x" /> 
     </file> 
     <file> 
     <filename value="7215_SG.csv" /> 
     <type value="-" /> 
     <size value="1584161" /> 
     <modification value="2014-11-03T12:06:46.000Z" /> 
     <permissions value="rw-r--r--" /> 
     </file> 
     <file> 
     <filename value="6171_SG.csv" /> 
     <type value="-" /> 
     <size value="2298481" /> 
     <modification value="2014-11-03T12:05:13.000Z" /> 
     <permissions value="rw-r--r--" /> 
     </file> 
    </files> 
    <result success="true" /> 
    </ls> 
</session> 

這是sql語句導入XML:

 
SELECT 
    xmldata.value('(./filename/@value)[1]', 'NVARCHAR(50)') AS szFilename, 
    xmldata.value('(./type/@value)[1]', 'NVARCHAR(50)') AS szType, 
    xmldata.value('(./size/@value)[1]', 'NVARCHAR(50)') AS szSize, 
    xmldata.value('(./modification/@value)[1]', 'NVARCHAR(50)') AS szModification, 
    xmldata.value('(./permissions/@value)[1]', 'NVARCHAR(50)') AS szPermissions 
FROM 
    (SELECT CAST(x AS XML) 
    FROM OPENROWSET(BULK 'd:\temp\Test\log.xml', 
    SINGLE_BLOB) AS T(x)) AS T(x) 
CROSS APPLY 
    x.nodes('//session/ls/files/file') AS X(xmldata); 

你能幫助我,告訴我,我到底做錯了什麼?

在此先感謝!

+0

假設這是'SQL-server' - 只是'SQL'只表示**查詢語言** - 而不是數據庫.....請總是**提供**具體數據庫**(最好也是它的**版本**)爲您的數據庫相關的問題! – 2014-11-04 12:54:18

+0

你得到的錯誤是什麼? (如果有的話)這些信息總是有幫助的。 – funkwurm 2014-11-04 12:56:40

+0

我沒有任何錯誤。問題是查詢不返回任何值。 – user2811907 2014-11-04 14:20:32

回答

1

您只需簡單地需要尊重您的XML根節點上定義的XML名稱空間!

<session xmlns="http://winscp.net/schema/session/1.0" 
     ******************************************** 

爲了適應這種XML命名空間,你需要在你的XQuery定義的 - 在我看來,最好的辦法是使用WITH XMLNAMESPACES聲明:

;WITH XMLNAMESPACES(DEFAULT 'http://winscp.net/schema/session/1.0') 
SELECT 
    xmldata.value('(./filename/@value)[1]', 'NVARCHAR(50)') AS szFilename, 
    xmldata.value('(./type/@value)[1]', 'NVARCHAR(50)') AS szType, 
    xmldata.value('(./size/@value)[1]', 'NVARCHAR(50)') AS szSize, 
    xmldata.value('(./modification/@value)[1]', 'NVARCHAR(50)') AS szModification, 
    xmldata.value('(./permissions/@value)[1]', 'NVARCHAR(50)') AS szPermissions 
FROM 
    (SELECT CAST(x AS XML) 
    FROM OPENROWSET(BULK 'd:\temp\Test\log.xml', SINGLE_BLOB) AS T(x)) AS T(x) 
CROSS APPLY 
    x.nodes('//session/ls/files/file') AS X(xmldata); 
+0

感謝marc_s,但如果服務器沒有互聯網訪問權限以獲取名稱空間,該怎麼辦?有沒有使用名稱空間來獲取數據? – user2811907 2014-11-04 14:19:51

+0

@ user2811907:XML名稱空間只是**字符串!**它有**沒有與互聯網相關的任何事情 - 您不需要任何互聯網連接來運行此操作 – 2014-11-04 14:38:07