SSMS查询结果复制到网格视图时,CRLF换行符未被保留,有更好的技巧吗?

88

当我在网格中有一个结果集时,例如:

SELECT 'line 1
line 2
line 3'
或者
SELECT 'line 1' + CHAR(13) + CHAR(10) + 'line 2' + CHAR(13) + CHAR(10) + 'line 3'

在包含 CRLF 的情况下,网格中显示的内容似乎会将它们替换为空格(我猜是为了显示所有数据)。

问题在于,如果我正在生成代码脚本,我不能简单地剪切和粘贴这些内容。我必须将代码转换为打开游标并打印相关列,以便我可以从文本结果中复制并粘贴它们。

有什么更简单的解决方法来保留在结果网格中进行复制/粘贴操作时的CRLF吗?

网格非常有用的原因是我当前正在为不同列中的同一对象生成许多脚本 - 在一个列中是 bcp 输出,在另一个列中是 xml 格式文件,在另一个列中是表创建脚本等等...

5个回答

158

此问题已在SSMS 16.5构建13.0.16000.28中得到解决,新增了一个选项用于保留复制/保存操作中的CR/LF (更多详情) (Connect bug)。

  1. 工具 > 选项
  2. 展开查询结果 > SQL Server > 结果网格
  3. 勾选在复制或保存时保留CR/LF
  4. 重新启动SSMS

这将使 CR, LFCRLF 在复制单元格时被视为换行符。


49
另外需要注意的是:在选择该选项后,我不得不重新启动 SSMS 才能让它开始工作。 - Wouter
3
如果早点看到这个,它本来可以为我节省几个小时的时间。我曾经认为 SSIS 包会清除我的换行符。在这个更改生效之前,我还需要重新启动 SSMS。 - Eric Harlan
8
对我来说,更改的设置已经影响了一个新的查询窗口。无需重新启动 SSMS。 - JanW
16
为什么这个不是默认开启的? - jtate
14
无需重新启动SSMS,但需要关闭查询编辑器窗口并打开一个新的查询编辑器窗口。 - youcantryreachingme
不得不重新启动SSMS,因为关闭查询编辑器窗口并打开新的查询编辑器窗口无法捕捉到更改。 - Ian Boyd

12

回答这个问题,因为我总是记不住它在哪里:

在此处输入图像描述


1
基于工具选项队列(结果)S(ql服务器)R(结果到)网格的首字母缩略词助记符: 最佳任务应该返回黄金 - George Menoutis

2

警告: 这个功能肯定还存在某种类型的 bug。

首先,我已经数月没有触碰这个选项,并且最近也重启过了。

我的查询有多列,其中一列包含客户反馈(带换行符)。当我将结果粘贴到 Google 文档 / Excel 中时,反馈变成了一行(如我所愿)。

然后我将查询复制到另一个文件中并再次运行。这一次,结果包含了换行符!

因此,要么存在非常奇怪的 bug,要么有一些秘密快捷键可以更改当前窗口的设置。如果有人看到了这种行为,感兴趣的话请告知。


-4

这是一个hack,但可以尝试一下:

将结果集用REPLACE (.....,CHAR(13)+CHAR(10),CHAR(182))包装起来以保留换行符,然后再将其替换回来。

SELECT 
    REPLACE ('line 1' + CHAR(13) + CHAR(10)+ 'line 2' + CHAR(13) + CHAR(10) + 'line 3'
            ,CHAR(13)+CHAR(10),CHAR(182)
            )

输出:

----------------------
line 1¶line 2¶line 3

(1 row(s) affected)

将它们替换回SQL:

select replace('line 1¶line 2¶line 3',CHAR(182),CHAR(13)+CHAR(10))

输出:

-------------------
line 1
line 2
line 3

(1 row(s) affected)

或者在一个好的文本编辑器中。


3
我很感激你的努力,但这并不比在文本输出模式下逐个选择单个列或使用光标进行打印更省事。 - Cade Roux

-4

你可以做的一件事是将结果发送到文件中,然后使用一个能够监视文件更改并具有优越理解输出能力的编辑器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接