如何避免sqlcmd结果集之间出现空行?

发布于 2024-07-14 01:06:28 字数 479 浏览 5 评论 0原文

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

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

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

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

Refering my last question on extracting SQL stored procedures into .sql files (see here) I have another question:

How to avoid or delete the sqlcmd blank line between result sets?

Reason (see MSDN)
When multiple results are returned, sqlcmd prints a blank line between each result set in a batch.

This means that stored procedures (longer than 4000 chars) are split into two parts each, in syscomments and if exported with sqlcmd into text (.sql) file there will be a new line at this split point. How to remove or avoid it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

画▽骨i 2024-07-21 01:06:28

这是您的 批处理文件(它将适用于> 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 - 搜索对象中的文本

here is update for your batch file (it will work for > 8000 chars limit but it's easy to tune up this limit):

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"

personally I'm concerned about so large procedures.

that's a limitation, but if you have stored procedures with line numbers longer than 4000 characters, you probably have much, much bigger problems than can be solved reading this blog
...
none of my stored procedures have lines greater than about 150 characters long, so that's probably not a huge deal for most people. As I said, if your lines are that long, you have bigger problems!
Adam Machanic - "Reflect" a TSQL routine

but there are also thoughts that large procedures are not an issue:

"text" field is defined as NVARCHAR(4000) so each row can only hold up to 4000 characters. However, it is not uncommon to have object code that is much larger than 4000 characters.
Solomon Rutzky - Searching Objects for Text

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文