我正在使用以下命令将存储过程的输出写入文件以进行进一步处理:
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 的选项组合可以产生所需的输出?还是我必须找到其他方法来生成这个文件?
在尝试评论中的各种建议时,我偶然发现了一个解决方案。
我更换了:
和:
并且所有的文本都被输出了。
但是,使用变量:
没有。
起作用的是声明具有特定长度的变量:
因此,由于这种情况下的文本永远不会超过 2000 个字符(读取文件的设备无法处理那么长的文本),我将所有文本转换为 2000 个字符长的字符串:
这就是方法。我仍然不知道为什么。
奇怪... using
-y 0
实际上对我来说非常有效。没有空白填充或任何其他格式问题。它实际上比 更好-W
,即使文档没有解释原因并且仍然建议使用-W
:虽然它根本没有记录,但它似乎
-y 0
实际上做了-W
广告,以及更多(无限的字符串长度,它甚至负责删除标题,所以不需要-h-1
)。我必须使用的唯一其他选项是-s ","
指定不同的列分隔符。我
13.1.0007.0
在 Linux 上使用版本,所以也许 OP 的问题是在更高版本中修复的问题。我遇到的唯一问题是在很长的字符串(超过 10 万个字符)的末尾添加了一个不可打印的字符(看起来像盒子的东西),但是当字符串被引用 (
'"' + field + '"'
) 时,该字符就消失了。¯\_(ツ)_/¯在 SSMS 选项中,将Query Results > Restuls 更改为 Text > 每列中显示的最大字符数: