2014-06-21 88 views
5

在閱讀one answersecond answerinfopage on sqlcmd我仍然無法得到以下工作。如何防止sqlcmd截斷與XML路徑查詢結果

我想在批處理文件中使用sqlcmd查詢一個xml文件的結果。

的批處理文件看起來是這樣的:

sqlcmd -R -d DBName -i "c:\inputquery.sql" -h-1 -y 0 -o "c:\outputfile.xml" 

的simplicated SQL查詢:

:XML ON 
SELECT '<?xml version="1.0" encoding="UTF-8"?>' + 
CAST((
SELECT Columns FROM Table 
FOR XML PATH ('Product'), ROOT('Products') 
) 
AS NVARCHAR(MAX)) 

輸出爲約1025Kb絲毫截斷字符串中的XML文件。我認爲它截斷到1mb,但你怎麼能防止這個?目標是將完整的查詢結果導入到xml文件中。據我所知,所有的選項已經被使用了。順便用TSQL SSMS2008。

+0

如果您只是在SSMS中工作,那麼可以選擇控制返回多少XML數據。 1MB,2MB,5MB或無限制。請參見工具|選項|查詢結果| SQL Server |結果到網格| XML數據。它沒有「結果到文件」的選項。但也許你可以運行查詢到網格,然後保存結果? –

+0

如果您只使用SSMS,那麼這將工作,但我需要使用批處理文件自動執行該過程。 SSMS設置對sqlcmd結果沒有影響。不管怎麼說,還是要謝謝你! – J3FFK

+0

我已經使用BCP來做這樣的事情。這是一個BCP的例子:http://stackoverflow.com/a/2586615/822072 –

回答

0

您需要將XML輸出爲XML類型。通常,除FOR XML之外,還使用TYPE指令完成此操作。但是如果你想添加Xml聲明,你將不得不把所有東西放入一個xml變量中,然後選擇它。例如:

DECLARE @XML AS XML 
SET @XML = ' 
SELECT ''<?xml version="1.0" encoding="UTF-8"?>'' + 
CAST((
SELECT Columns FROM Table 
FOR XML PATH (''Product''), ROOT(''Products'') 
) 
AS NVARCHAR(MAX)) 
' 
SELECT @XML 

編輯:對不起。添加Xml聲明將不起作用,因爲Sql以其本地編碼(UTF-16)將該流呈現爲XML,並且它將剝離任何聲明。

3

今天我遇到了同樣的問題,我用-y0選項。我的輸出現在看起來正確。以爲我會張貼我的發現,所以它可能會幫助其他人遇到同樣的事情。

sqlcmd -Sxxxxxxx -E -dmaster -h-1 -y0 -Q" my query that produces long results in here;" > "D\:out.txt" 

-h-1也刪除列標題。

+0

'-y0'的最大值是1兆字節。 (我的問題與OP中1048676個字符不夠)相同。 – gws

+0

當我嘗試使用'-h-1'和'-y0'時,得到以下錯誤信息:'Sqlcmd:-h和-y 0個選項是互斥的。儘管看起來甚至沒有'-h-1',但頭部卻被排除了。 – ArtOfWarfare