如何避免Resultsets之间的sqlcmd空白行?

时间:2009-02-24 09:53:38

标签: sql stored-procedures sqlcmd

引用我关于将SQL存储过程提取到.sql文件的最后一个问题(see here)我有另一个问题:

如何避免或删除Resultsets之间的sqlcmd空行?

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

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

提前致谢!

肖恩

1 个答案:

答案 0 :(得分:2)

此处是your批处理文件的更新(它适用于> 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 - "Reflect" a TSQL routine

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

  

“text”字段定义为NVARCHAR(4000),因此每行最多只能容纳4000个字符。但是,拥有远大于4000个字符的目标代码并不罕见。   Solomon Rutzky - Searching Objects for Text