如何將超過 256 個字元輸出到文件?
我正在使用以下命令將儲存過程的輸出寫入文件以進行進一步處理:
DECLARE @shellCommand VARCHAR(2000) SET @shellCommand = 'SQLCMD -S ' + @@SERVERNAME + ' -d ' + @dbName + ' -U ' + @UserName + ' -P ' + @Password + ' -Q "' + @sqlCommand + '" -s "," -h -1 -k 1 -W -o "' + @outputfileName + '"'
@sqlCommand
正確設置為“EXEC StoredProcedureName parameterValue”,並且在獨立執行時顯然會產生正確的數據。我遇到的問題是其中一個欄位包含長度超過 256 個字元的文本,並且在通過 SQLCMD 命令輸入時被截斷。
在閱讀文件時,我看到預設列寬是 256 個字元。所以我正在考慮使用
-y
or-Y
選項來允許輸出超過 256 個字元。-W
但是,這些選項與我用來從輸出中刪除尾隨空格的選項不兼容。我開始使用-y 0
(儘管有性能警告 - 一旦我得到輸出工作,我可以查看性能)。然而,這會產生一些奇怪的結果。該文件由一個標題行和後面的數據行組成,應該如下所示:
First,ABC,Number,String,ReallyLongString,... A,0123,14.99,"Short string","Longish string",... B,0456,23.99,"Normal string","Really, really long string that's causing problems",...
使用該
-W
選項,文件格式正確,但很長的字元串被截斷。我們發現它的原因是因為"
缺少尾隨並且文件沒有被正確讀取。隨著
-y 0
非常長的字元串得到輸出,但大量空格被添加到明顯隨機的列中。我們得到這樣的東西:First,ABC ,Number [...] ,String,ReallyLongString,... A ,0123,14.99 [...] ,"Short string","Longish string",... B ,0456,23.99 [...] ,"Normal string","Really, really long string that's causing problems",...
(“數字”和下一列之間還有很多很多空格,如“
$$ … $$“,我只是展示一些)。 還有更多的數值必須以類似的方式進行格式化,而且似乎正是這些數值導致了值之後和下一個逗號之前的額外空格。我們可以忍受一些額外的空間,但不能像這樣多,因為結果文件太大而無法被目標程序讀取。
數據由如下所示的儲存過程生成:
SELECT 'First' AS First, 'ABC' AS ABC, 'Number' AS Number, 'String' AS String, 'ReallyLongString' AS ReallyLongString, ... UNION ALL SELECT 'A' as First, Column1 as ABC, REPLACE(FORMAT(Column2, 'N2', 'en-GB'), ',', '') as Number, -- to get the format correct '"' + Column3 + '"' as String, '"' + Column4 + '"' as ReallyLongString, .... FROM Table WHERE <condition>
我認為問題是儲存過程的輸出。由於輸出了額外的尾隨空格,我只向
-W
SQLCMD 添加了該選項,但是查看儲存過程我無法確定它們的來源。我將數字格式更改為包括RTRIM
:RTRIM(REPLACE(FORMAT(Column2, 'N2', 'en-GB'), ',', ''))
但這似乎沒有什麼區別。
我可以對儲存過程做些什麼,或者是否有 SQLCMD 的選項組合可以產生所需的輸出?還是我必須找到其他方法來生成這個文件?
在嘗試評論中的各種建議時,我偶然發現了一個解決方案。
我更換了:
'"' + Column4 + '"' as ReallyLongString,
和:
'"' + REPLICATE('O', 4000) + '"' AS ReallyLongString,
並且所有的文本都被輸出了。
但是,使用變數:
DECLARE @longText NVARCHAR(MAX) SET @longText = REPLICATE('O', 4000); '"' + @longText + '"' AS ReallyLongString,
沒有。
起作用的是聲明具有特定長度的變數:
DECLARE @longText NVARCHAR(4000)
因此,由於這種情況下的文本永遠不會超過 2000 個字元(讀取文件的設備無法處理那麼長的文本),我將所有文本轉換為 2000 個字元長的字元串:
SELECT 'A' as First, Column1 as ABC, REPLACE(FORMAT(Column2, 'N2', 'en-GB'), ',', '') as Number, -- to get the format correct '"' + CAST(Column3 as NVARCHAR(2000)) + '"' as String, '"' + CAST(Column4 as NVARCHAR(2000)) + '"' as ReallyLongString, .... FROM Table WHERE <condition>
這就是方法。我仍然不知道為什麼。