我有时有一个 SQL 脚本,其中包含一个或多个超长(有时甚至是愚蠢的长)字符串。通常这些是VARBINARY
代表文件/程序集的文字/常量,但有时它们是文本。
真正长字符串的主要问题是一些文本编辑器不能很好地处理它们。例如,我有一个VARBINARY
在语句中使用的文字CREATE 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';
返回(在“消息”选项卡中):
Line1
Line2
这很有意义,因为换行符在文字/常量内。但是这样做VARBINARY
也行不通。
PRINT 0x1234
5678;
给我一个错误。
\值得庆幸的是,在 T-SQL 中通过(反斜杠)字符支持行继续。只需将其放在行尾,就在newline/ carriage-return+之前line-feed,换行符将被忽略。
对于文本字符串,其行为如下:
返回(在“消息”选项卡中):
对于二进制/十六进制字符串,其行为如下:
返回(在“消息”选项卡中):
为了将二进制文件(程序集、证书)格式化为十六进制文本字符串以便在 SQL 脚本中使用,我编写了一个名为BinaryFormatter的命令行实用程序,该实用程序已在 GitHub 上作为开源发布。它不仅将二进制文件转换为文本表示形式,而且还
VARBINARY
根据每行要使用的指定字符数,使用行延续将长文字分散到所需的多行中。结果是这样的:然后我将其复制并粘贴到我的脚本中,如下面的
{...}
区域所示:有关此主题的更多详细信息,请参阅我的博客文章: T-SQL 中的行继续