4

参考我关于将 SQL 存储过程提取到 .sql 文件中的最后一个问题(请参见此处)我还有另一个问题:

如何避免或删除结果集之间的 sqlcmd 空行?

原因(参见 MSDN) 当返回多个结果时,sqlcmd 会在批处理中的每个结果集之间打印一个空行。

这意味着存储过程(超过 4000 个字符)分别在 syscomments 中拆分为两部分,如果使用 sqlcmd 导出到文本 (.sql) 文件中,则在此拆分点将有一个新行。如何消除或避免它?

提前致谢!

肖恩

4

1 回答 1

2

这是您的批处理文件的更新(它将适用于> 8000个字符的限制,但很容易调整此限制):

for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER -d DB -h-1 -Q "DECLARE @I INT, @SP1 NVARCHAR(4000), @SP2 NVARCHAR(4000) SET @I = 0 SET @SP1 = '' SET @SP2 = '' SELECT @I = @I + 1, @SP1 = CASE WHEN @I = 1 THEN text ELSE @SP1 END, @SP2 = CASE WHEN @I = 2 THEN text ELSE @SP2 END from dbo.syscomments WHERE id = OBJECT_ID('%%a') SELECT @SP1+@SP2" -o "%%a.sql"

我个人担心这么大的程序。

这是一个限制,但是如果您的存储过程的行号超过 4000 个字符,那么您可能会遇到比阅读这篇博客所能解决的问题要大得多的问题......我的存储过程中没有一个行的长度超过 150 个字符,所以这对大多数人来说可能不是什么大不了的事。正如我所说,如果你的线路那么长,你就有更大的问题!
Adam Machanic - “反映” TSQL 例程

但也有人认为大程序不是问题:

“文本”字段定义为 NVARCHAR(4000),因此每行最多只能容纳 4000 个字符。但是,目标代码远大于 4000 个字符的情况并不少见。 Solomon Rutzky - 在对象中搜索文本

于 2009-02-25T17:04:31.083 回答