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


13

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

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

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

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

PRINT 'Line1
Line2';

返回(在“消息”标签中):

Line1
Line2

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

PRINT 0x1234
5678;

给我一个错误。

Answers:


13

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

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

PRINT 'Line1\
Line2';

返回(在“消息”标签中):

Line1Line2

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

PRINT 0x1234\
5678;

返回(在“消息”标签中):

0x12345678;

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

4D5A09DE34F178313345A4\
00007F4E39782EFC48D842\
00000000

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

CREATE ASSEMBLY [AssemblyName]
FROM 0x\
{output from BinaryFormatter}
;

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.