236

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

4

11 回答 11

263

我能够从 NVARCHAR(MAX) 列中获取全文(99,208 个字符),方法是仅选择(结果到网格)该列,然后右键单击它,然后将结果保存为 CSV 文件。要查看结果,请使用文本编辑器(不是 Excel)打开 CSV 文件。有趣的是,当我尝试运行相同的查询但启用了Results to File 时,输出被使用Results to Text 限制截断。

@MartinSmith 描述为对(当前)接受的答案的评论的解决方法对我不起作用(尝试查看完整的 XML 结果时出错,抱怨“'[' 字符,十六进制值 0x5B,不能包含在名称中”)。

于 2015-03-11T19:44:10.793 回答
182

快速技巧-

SELECT CAST('<A><![CDATA[' + CAST(LogInfo as nvarchar(max)) + ']]></A>' AS xml)
FROM Logs
WHERE IDLog = 904862629
于 2016-05-12T06:02:54.267 回答
115

在较新版本的 SSMS 中,可以在(查询/查询选项/结果/网格/检索的最大字符数)菜单中进行配置:

在此处输入图像描述


旧版本的 SSMS

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

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

...

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

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

BTW Results to Text有更严重的限制:

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

于 2012-08-10T08:30:18.820 回答
59

我已经为 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 结果网格可视化工具

于 2012-08-10T10:56:46.047 回答
11

以 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参数设置为适合您需要的值。

于 2019-07-23T11:37:20.967 回答
5

我今天用这个方法成功了。它与其他答案类似,它也将内容转换为 XML,只是使用不同的方法。正如我没有看到FOR XML PATH答案中提到的那样,我想我会为了完整性添加它:

SELECT [COL_NVARCHAR_MAX]
  FROM [SOME_TABLE]
  FOR XML PATH(''), ROOT('ROOT')

这将提供一个有效的 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')
于 2020-09-10T13:58:55.790 回答
2

PowerShell 替代品

这是一篇旧帖子,我通读了答案。尽管如此,我还是觉得输出未从 SSMS 更改的多行大文本字段有点太痛苦了。我最终为我的需要编写了一个小型 C# 程序,但我想它可能可以使用命令行来完成。事实证明,使用 PowerShell 很容易做到这一点。

首先SqlServer从管理 PowerShell 安装模块。

Install-Module -Name SqlServer

用于Invoke-Sqlcmd运行您的查询:

$Rows = Invoke-Sqlcmd -Query "select BigColumn from SomeTable where Id = 123" `
    -MaxCharLength 2147483647 -ConnectionString $ConnectionString

这将返回一个可以输出到控制台的行数组,如下所示:

$Rows[0].BigColumn

或者输出到文件如下:

$Rows[0].BigColumn | Out-File -FilePath .\output.txt -Encoding UTF8

结果是美丽的未截断文本写入文件以供查看/编辑。我确信有一个类似的命令可以将文本保存回 SQL Server,尽管这似乎是一个不同的问题。

编辑:事实证明@dvlsc 有一个答案,将这种方法描述为次要解决方案。我认为因为它被列为次要答案,这就是我最初错过它的原因。我将留下我的答案,重点是 PowerShell 方法,但至少想在应得的地方给予赞扬。

于 2020-10-14T16:52:46.783 回答
1

如果您只需要查看它,我使用了这个:

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 字符串。否则太难读了!

于 2020-01-28T23:44:03.400 回答
1

使用带有 sql server 插件的 Visual Studio 代码。对 json 超级有用

于 2021-09-29T19:43:02.363 回答
0

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

备选方案 2:右键单击并导出到 CSV 文件

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

SELECT SUBSTRING(fileXml,2200,200) 从 mytable WHERE id=123456

于 2019-09-26T19:54:31.423 回答
-3

快速查看大型 varchar/text 列的最简单方法:

declare @t varchar(max)

select @t = long_column from table

print @t
于 2018-10-24T19:33:21.347 回答