2017-03-14 30 views
4

我執行以下命令:SQLCMD和/或PowerShell的包裝XML輸出

sqlcmd -i "\\path\to\sqlfile.sql" -S "ServerName" -d "DBName" -y 0 

其中sqlfile.sqlDECLARE報表少數幾個變量,然後嵌套SELECT ... FOR XML Path('...')語句的樹最終生成一個大XML字符串作爲輸出。

在PowerShell命令提示符下,我管輸出到文件:

sqlcmd -i "\\path\to\sqlfile.sql" -S "ServerName" -d "DBName" -y 0 | Out-File C:\path\to\output.xml 

(或者我可以使用的命令本身,我沒有強烈的偏好無論哪種方式-o。)

的這裏的目標是讓一個XML文件可以被加載到另一個下游進程中。這工作得很好,除了目前我卡住的一個細節。輸出(到文件)以2,033個字符自動換行。這意味着它產生破壞的XML如果(在大多數情況下)的包裝打破了標籤:

<SomeTag>This is some content just to illustrate.</Som 
eTag> 

我使用的sqlcmd參數-w試過。在測試中,如果測試的值低於2,033,但高於2,033(例如,20000,可能會超過足夠寬),則會保留相同的最大值2,033。

我也打過電話-replace管道輸出之前嘗試刪除換行符,如:

([the sqlcmd command above]) -replace "\r", "" | Out-File C:\path\to\output.xml 

要包括\r嘗試,\n\r\n,並採用背蜱,而不是反斜線。一切都無濟於事。 (在測試中,-replace "KnownString", "TEST"確實成功地用TEST取代了已知的字符串。)

也許隧道視野已經佔據了這裏。我錯過了什麼更容易?目標是使用PowerShell命令行命令執行.sql文件,並將有效的XML(不需要漂亮打印,儘管這很酷)轉換爲.xml文件。

有什麼我可以在這裏添加/修改,這將突破2,033字符的寬度限制?或者,也許更有創意的方法來實現相同的目標?

+1

嘗試使用'-repalce'\ r | \ n''來處理換行/回車的任一順序?您還可以使用舊版本的'sqlcmd',在poweshell或cmdlet中使用本機'SqlClient'類(http://stackoverflow.com/questions/10894688/how-to-execute-sql-file-using-powershell)讀取數據。行爲似乎是SQL 2012中的一個已知錯誤,請參閱變通方法的鏈接https://connect.microsoft.com/SQLServer/feedback/details/786004/sqlcmd-with-xml-on-break-lines-on-large-輸出 –

+1

@FrodeF .:看起來這些解決方法的組合正在訣竅中。具體而言,將'SELECT'封裝在'XML'類型變量中,然後選擇該變量爲'NVARCHAR(MAX)'。使用'sqlcmd',不需要替換字符。隨意添加爲答案,謝謝! – David

回答

3

the other answer跟進......

(注:我要留具體到在這種情況下,SQL 2012這是一個客戶端擁有工作站,他們有自己的規則。)

我包裹着我.sql文件中的以下內容:

SET NOCOUNT ON 
DECLARE @XML AS XML 

SET @XML = ([the great big set of nested selects generating xml]) 

SELECT CAST(@XML AS NVARCHAR(MAX)) 

然後調用簡單地爲:

sqlcmd -i "\\path\to\sqlcode.sql" -S "ServerName" -d "DBName" -o "C:\path\to\output.xml" -y0 

結果是XML的在輸出文件中的單個線。 (我可以稍後打印它的小腳踢。)