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

Nic*_*ckG 170 t-sql sql-server ssms sql-server-2008

如何在SQL Server Management Studio中查看NTEXT或NVARCHAR(max)中的所有文本?默认情况下,它似乎只返回前几百个字符(255?),但有时我只想快速查看整个字段,而不必编写程序来执行此操作.即使SSMS 2012仍然有这个问题:(

Eri*_*ric 196

通过选择(结果到网格)该列然后右键单击它然后将结果保存为CSV文件,我能够从NVARCHAR(MAX)列中获取全文(99,208个字符).有趣的是,当我尝试运行相同的查询,但启用了结果到文件时,输出被截断使用结果到文本限制.

@MartinSmith描述为对(当前)接受的答案的评论的解决方法对我不起作用(在尝试查看完整的XML结果时出现错误抱怨"'''字符,十六进制值0x5B,不能被列入名称").

  • 右键单击,另存为,CSV为我工作,就像一个魅力,从NTEXT字段中获取巨大的文本值. (16认同)
  • 但是不要在Excel中打开它,CSV导入将再次截断数据.:) (6认同)
  • 保存为制表符分隔的文本效果更好。csv 格式将文本中的所有引号加倍。 (5认同)
  • @ajeh:您使用的是哪个版本的SSMS 2012?我刚用SSMS 2012(版本11.0.5343.0)对它进行了测试(按照我在答案中描述的相同步骤)进行测试 (3认同)
  • 谢谢,保存为CSV就像一个魅力. (3认同)
  • 通过添加双引号,导出为 CSV 会破坏 JSON。通过在 2037 个字符(显然是最大行长度)之后插入换行符,以 TAB 分隔导出会破坏 JSON。似乎不可能让 SSMS 切换超过大约 2000 个字符的任何 JSON。 (2认同)
  • 我必须另存为文本。就我而言,当保存到 csv 时,它用双引号对转义了双引号。 (2认同)
  • 使用 SSMS 17.9.1,我能够获取最多 10MB 的 JSON 数据,其他所有内容都被截断。我使用“保存类型”和“所有文件”(不是 CSV 或文本)来防止添加任何不必要的字符。 (2认同)

小智 122

快速技巧:

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

  • 当列的内容实际上是XML时,这完美地工作(没有CDATA部分) (5认同)
  • 这也适用于我,我有json数据,我需要从ms sql中获取. (2认同)

Rem*_*anu 81

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

若要更改当前查询的选项,请单击"查询"菜单上的"查询选项",或右键单击"SQL Server查询"窗口并选择"查询选项".

...

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

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

BTW 结果到文本有更严重的限制:

每列中显示的最大字符数
此值默认为256.增大此值以显示更大的结果集而不截断.最大值是8,192.

  • @IvanG - 不是.它可以像XML一样以超链接方式进行超链接,单击它会在新窗口中打开它.我通常使用的工作是将其转换为XML [如此处](http://stackoverflow.com/q/8930034/73226).可以将XML数据设置为允许无限长度. (13认同)
  • 仅当字符数<65535(距离ntext最大值很远)时才有效. (11认同)
  • 正如 Remus 在他的回答中所写,存在限制,因为 MAX 定义的列中数据类型的最大存储大小为 2 GB,因此必须存在一些限制,因为在 SSMS 中显示所有数据会很麻烦。 (2认同)

And*_*ich 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结果网格可视化器

  • 它不是商业性的 - 它是免费的.您可以购买它,如果您想支持该项目,但您也可以100%免费使用它:http://www.ssmsboost.com/generate-free-license-for-ssmsboost-ssms-add-in (12认同)
  • 不幸的是,截至2017年9月4日,SSMS Boost不再免费(每个新版本发布的30天试用除外) (7认同)
  • 看起来是一个非常有用的扩展,但我不能接受它作为答案,因为它需要商业产品(或试用版)。不过还是谢谢! (3认同)
  • +1尼斯免费扩展功能完美...谢谢! (3认同)
  • 现在这是一种商业产品,免费许可证不包含任何上述功能,这些功能已被禁用,您会弹出一个窗口购买PRO版本。答案仅仅是他软件的升级。 (3认同)
  • 谢谢,这正是我想要的。 (2认同)
  • 我知道软件链接可能会消失,因此被认为是错误的答案,但这是一个非常快速的设置解决方案,可以解决仅通过更改设置无法解决的问题。 (2认同)
  • 用户写下“付费功能”和“产品促销”:上面的原始答案是在 2012 年写的。该插件从 2011 年到 2017 年底一直在大力开发,尽管一直保持 100% 免费。在某个阶段,为了支持其连续性,它变成了付费产品,并保留了一些免费功能。我很高兴为那些发现 SSMSBoost 功能有用并重视使用它节省的时间的人提供易于使用的解决方案。 (2认同)

dvl*_*lsc 6

以 XML 形式返回数据

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

确保在 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"
Run Code Online (Sandbox Code Playgroud)

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


tak*_*krl 6

我今天用这个方法成功了。它与其他答案类似,它也将内容转换为 XML,只是使用不同的方法。由于我没有FOR XML PATH在答案中看到提及,我想我应该添加它以确保完整性:

SELECT [COL_NVARCHAR_MAX]
  FROM [SOME_TABLE]
  FOR XML PATH(''), ROOT('ROOT')
Run Code Online (Sandbox Code Playgroud)

这将提供一个有效的 XML,其中包含嵌套在外部元素中的所有行的内容<ROOT></ROOT>。各行的内容将分别包含在一个元素内,在本例中,该元素称为<COL_NVARCHAR_MAX>。可以通过使用别名来更改其名称AS

&或类似<的特殊字符>将被转换为其各自的实体。因此,您可能必须将&lt;,&gt;转换&amp;回其原始字符,具体取决于您需要对结果执行的操作。

编辑

我刚刚意识到也CDATA可以使用指定FOR XML。不过我觉得有点麻烦。这样就可以做到:

SELECT 1 as tag, 0 as parent, [COL_NVARCHAR_MAX] as [COL_NVARCHAR_MAX!1!!CDATA]
  FROM [SOME_TABLE]
  FOR XML EXPLICIT, ROOT('ROOT')
Run Code Online (Sandbox Code Playgroud)