SQL Server / T-SQL 是否支持换行以拆分长字符串?

Sol*_*zky 13 sql-server ssms scripting t-sql

有时我有一个 SQL 脚本,其中包含一个或多个超长(有时甚至是愚蠢的)字符串。通常这些是VARBINARY代表文件/程序集的文字/常量,但有时它们是文本。

真正长字符串的主要问题是一些文本编辑器不能很好地处理它们。例如,我VARBINARYCREATE ASSEMBLY [AssemblyName] FROM 0x....语句中使用了一个文字,而程序集本身的大小刚好超过 1 MB,相当于文本文件中的字符超过 200 万个,因为每个字节需要两个字符以十六进制表示法表示(例如0x1F= a1和 an F)。SQL Server Management Studio (SSMS) 不能很好地处理这个问题,并在我尝试滚动该行时挂起几秒钟。事实上,某些版本(不确定这是否仍然发生)甚至会在打开至少有一行超过特定长度的脚本时显示关于长行的警告。

第二个问题是,在没有启用自动换行的编辑器中使用或在线发布时,它会使格式复杂化。这里的问题是水平滚动条的滑块非常窄,即使稍微移动它,通常也会将非超长文本滚动到视野之外。

现在,T-SQL 不会用换行符甚至分号终止命令(尽管从 SQL Server 2005 开始,分号是首选/推荐的)。因此,由于 SQL Server 知道如何解析每个语句,从而知道它何时结束,似乎将长行拆分为多行,仅由newline/ carriage-return+分隔line-feed,这似乎并不合理。但这在任何一种情况下都不起作用。

PRINT 'Line1
Line2';
Run Code Online (Sandbox Code Playgroud)

返回(在“消息”选项卡中):

Line1
Line2
Run Code Online (Sandbox Code Playgroud)

这很有意义,因为换行符在文字/常量内。但是对 a 执行此操作VARBINARY也不起作用。

PRINT 0x1234
5678;
Run Code Online (Sandbox Code Playgroud)

给我一个错误。

Sol*_*zky 14

幸运的是,T-SQL 中通过\(反斜杠)字符支持换行。只需将它放在一行的末尾,就在newline/ carriage-return+之前line-feed,换行符将被忽略。

对于文本字符串,其行为如下:

PRINT 'Line1\
Line2';
Run Code Online (Sandbox Code Playgroud)

返回(在“消息”选项卡中):

Line1Line2
Run Code Online (Sandbox Code Playgroud)

对于二进制/十六进制字符串,其行为如下:

PRINT 0x1234\
5678;
Run Code Online (Sandbox Code Playgroud)

返回(在“消息”选项卡中):

0x12345678;
Run Code Online (Sandbox Code Playgroud)

为了将二进制文件(程序集、证书)格式化为文本十六进制字节字符串以在 SQL 脚本中使用,我编写了一个名为BinaryFormatter的命令行实用程序,该实用程序已在 GitHub 上作为开源发布。它不仅将二进制文件转换为文本表示形式,而且还VARBINARY根据每行要使用的指定字符数,使用行延续将长文字扩展到所需的行数。结果是:

PRINT 'Line1\
Line2';
Run Code Online (Sandbox Code Playgroud)

然后我将其复制并粘贴到我的脚本中,如{...}下面的区域所示:

Line1Line2
Run Code Online (Sandbox Code Playgroud)

有关此主题的其他详细信息,请参阅我的博客文章: T-SQL 中的行连续