Sql-Server

如何將超過 256 個字元輸出到文件?

  • March 5, 2020

我正在使用以下命令將儲存過程的輸出寫入文件以進行進一步處理:

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 個字元。所以我正在考慮使用-yor-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>

我認為問題是儲存過程的輸出。由於輸出了額外的尾隨空格,我只向-WSQLCMD 添加了該選項,但是查看儲存過程我無法確定它們的來源。我將數字格式更改為包括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>

這就是方法。我仍然不知道為什麼。

引用自:https://dba.stackexchange.com/questions/165429