如何在SSMS中查看ntext或nvarchar(max)中的所有文本?


Answers:


91

选项(查询结果/ SQL Server /结果到网格页面)

若要更改当前查询的选项,请在“查询”菜单上单击“查询选项”,或在“ SQL Server查询”窗口中右键单击并选择“查询选项”。

...

检索
到的最大字符数输入1到65535之间的一个数字,以指定将在每个单元格中显示的最大字符数。

如您所见,最大值为64k。默认值要小得多。

顺便说一句BTW 结果到文本有更大的局限性:

每列中显示的最大字符数
此值的默认值为256。增加此值可显示更大的结果集而不会被截断。最大值为8,192。


1
正如Remus在他的回答中所写的那样,存在局限性,因为用MAX定义的列中数据类型的最大存储大小为2 GB,所以必须有一定的局限性,因为在SSMS中显示所有这些数据会很麻烦。
伊万·G

13
@IvanG-并非如此。可以使用与XML相同的方式对其进行超链接,然后单击它会在新窗口中将其打开。我通常使用的解决方法是将其转换为XML,如下所示。可以将XML数据设置为允许无限长度。
马丁·史密斯

@MartinSmith有趣的是,有可能使SSMS显示如此大量的数据……
Ivan G

11
仅当字符数<65535(与ntext最大值相差很远)时才有效。
Polyfun 2015年

1
@IvanG甚至“结果到文件”都受此限制。
伊恩

216

通过仅选择该列的“结果到网格”,然后右键单击它,然后将结果另存为CSV文件,可以从NVARCHAR(MAX)列中获取全文(99,208个字符)。要查看结果,请使用文本编辑器(NOT Excel)打开CSV文件。有趣的是,当我尝试运行相同的查询但启用了“结果到文件”功能时,使用“结果到文本”限制来截断输出。

@MartinSmith描述为(当前)已接受答案的注释的变通方法对我不起作用(尝试查看完整的XML结果并抱怨“'['字符,十六进制值0x5B,包含在名称中”)。


17
右键单击另存为CSV,这对我来说就像一种魅力,可以从NTEXT字段中获得巨大的文本值。
David Alpert

3
@ajeh:您正在使用哪个版本的SSMS 2012?我刚刚在我的SSMS 2012(版本11.0.5343.0)中对其进行了测试(遵循与我在回答中所述的相同的确切步骤),并且它可以正常工作
Eric

8
但不要在Excel中打开它,CSV导入将再次截断数据。:)
Johncl '17

1
谢谢,这让我从一个varchar(最大值)字段使用SSMS 2012文本导出数据的7MB
布莱恩Hasden

2
另存为制表符分隔的文本效果更好。csv格式将文本中的所有引号加倍。
davidthegrey

138

快速技巧

SELECT CAST('<A><![CDATA[' + CAST(LogInfo as nvarchar(max)) + ']]></A>' AS xml)
FROM Logs
WHERE IDLog = 904862629

6
当列的内容实际上是XML时,这完美地工作了(没有CDATA部分)
axk

2
这对我也很有效,我拥有从ms sql中移出所需的json数据。
Dev_Corps '17

同样,内容是XML转义的。取出文字后,应使用freeformatter.com之类的工具取消转义文字。
harsimranb

这对我有用:```DECLARE @g地理;...选择Cast(@ g.ToString()作为xml); “”
谢尔盖·兹诺维耶夫

1
这对我来说与SSMS v18一起使用,可以查看被其他解决方案截断的250kb json字符串。另外,我喜欢它,因为它为您提供了指向文本查看器的链接。+!
罗伯托

54

我已经为SSMS编写了一个加载项,并且此问题已在此处解决。您可以使用以下两种方式之一:

您可以使用“复制当前单元格1:1”将原始单元格数据复制到剪贴板:

http://www.ssmsboost.com/Features/ssms-add-in-copy-results-grid-cell-contents-line-with-breaks复制原始单元格内容

或者,您也可以使用“单元格可视化工具”功能在外部文本编辑器(记事本++或记事本)中打开单元格内容:http : //www.ssmsboost.com/Features/ssms-add-in-results-grid-visualizers

(该功能允许在任何外部应用程序中打开字段的内容,因此,如果您知道它是文本,则可以使用文本编辑器来打开它。如果内容是带有图片的二进制数据,则可以选择以图片形式查看。下面的示例显示了打开图片):SSMS结果网格可视化器


2
看起来是一个非常有用的扩展,但是我不能接受它作为答案,因为它需要商业产品(或试用版)。不过谢谢!
NickG 2012年

4
+1不错的免费扩展程序,效果很好...谢谢!

2
谢谢,这正是我想要的。
Derreck Dean 2014年

9
不幸的是,自2017年9月4日起,SSMS Boost不再免费(每个新版本的30天试用版除外)
csrowell

4
现在这是一种商业产品,免费许可证不包含任何上述功能,这些功能已被禁用,您会弹出一个窗口购买PRO版本。答案仅仅是他软件的升级。
metabuddy

3

以XML返回数据

SELECT CONVERT(XML, [Data]) AS [Value]
FROM [dbo].[FormData]
WHERE [UID] LIKE '{my-uid}'

确保根据期望的结果在SSMS选项窗口中设置合理的限制。 在此处输入图片说明

如果您要返回的文本不包含未编码的字符(例如&&amp;,则该方法将起作用,否则将导致XML转换失败。

使用PowerShell返回数据

为此,您将需要在运行命令的计算机上安装PowerShell SQL Server模块

如果一切都准备就绪,请配置并运行以下脚本:

Invoke-Sqlcmd -Query "SELECT [Data] FROM [dbo].[FormData] WHERE [UID] LIKE '{my-uid}'" -ServerInstance "database-server-name" -Database "database-name" -Username "user" -Password "password" -MaxCharLength 10000000 | Out-File -filePath "C:\db_data.txt"

确保将-MaxCharLength参数设置为适合您需要的值。


1

备选方案1:右键单击以将单元格复制并粘贴到“文本编辑器”中(希望有utf-8支持)

选择2:右键单击并导出到CSV文件

备选方案3:使用SUBSTRING函数使列的各个部分可视化。例:

从mytable WHERE id = 123456中选择SUBSTRING(fileXml,2200,200)


0

如果您只需要查看它,我已经使用过:

print cast(dbo.f_functiondeliveringbigformattedtext(seed) as text)

最终结果是我得到换行符和SMSS消息窗口中的所有内容。当然,它只允许一个单元格-如果要从多个行中创建一个单元格,则可以执行以下操作:

declare @T varchar(max)=''
select @T=@T
       + isnull(dbo.f_functiondeliveringbigformattedtext(x.a),'NOTHINGFOUND!')
       + replicate(char(13),4)
from x -- table containing multiple rows and a value in column a
print @T

我用它来验证SQL代码生成的JSON字符串。否则很难阅读!


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.