2013-12-16 47 views
4

我想知道,如何將XML內容從任意文件加載到本地變量中?T-SQL,將XML數據加載到本地變量

這適用於一個固定的文件:

DECLARE @xml XML 
SET @xml = 
(
    SELECT * 
    FROM OPENROWSET(BULK 'C:\data.xml', SINGLE_BLOB) AS data 
) 

不過,我想從任意文件中加載數據。

這不起作用(如BULK似乎只支持字符串參數)

DECLARE @file NVARCHAR(MAX) = 'C:\data.xml' 
DECLARE @xml XML 
SET @xml = 
(
    SELECT * 
    FROM OPENROWSET(BULK @file, SINGLE_BLOB) AS data 
) 

我也試過以下(沒有成功,因爲局部變量(@xml)似乎是超出範圍當執行EXEC時):

DECLARE @file NVARCHAR(MAX) = 'C:\data.xml' 
DECLARE @xml XML 
DECLARE @bulk NVARCHAR(MAX) = 'SET @xml = (SELECT * FROM OPENROWSET(BULK ''' + @file + ''', SINGLE_BLOB) AS data)' 
EXEC (@bulk) 

我猜我需要使用臨時表,但是如何?

回答

3

找到了解決辦法:

DECLARE @results table (result XML) 
DECLARE @sqlstmt NVARCHAR(MAX) 

SET @sqlstmt= 'SELECT * FROM OPENROWSET (BULK ''' + @file + ''', SINGLE_CLOB) AS xmlData' 

INSERT INTO @results EXEC (@sqlstmt) 
SELECT @xml = result FROM @results 
+0

正是憑藉這種解決的問題。 – sammybar

+0

這是一個解決方案的問題。如果xml文件是utf-8編碼並且包含國際字符(如Ó),並且xml文件不是以prolog <?xml version =「1.0」encoding =「UTF-8」?>開頭的,在這種情況下,sql server 2005錯誤地解釋了文件編碼,並且將其解釋爲「Ã」。根據這種情況下的標準,默認情況下,xml應該被認爲是utf-8編碼,但是sql 2005無法做到這一點。 – sammybar

+1

我發現解決方案:使用SINGLE_BLOB而不是SINGLE_CLOB。微軟表示:「我們建議您僅使用SINGLE_BLOB選項而不是SINGLE_CLOB和SINGLE_NCLOB導入XML數據,因爲只有SINGLE_BLOB支持所有Windows編碼轉換。」在http://msdn.microsoft.com/en-us/library/ms190312.aspx – sammybar

3

你也可以使用sp_executesql

declare @stmt nvarchar(max), @xml xml 

select @stmt = ' 
    set @xml = (select * from openrowset(bulk ''' + @file + ''', single_clob) as data) 
' 

exec dbo.sp_executesql 
    @stmt = @stmt, 
    @params = '@xml xml output', 
    @xml = @xml output