ChatGPT解决这个技术问题 Extra ChatGPT

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

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


D
DeveloperDan

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

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


右键单击,另存为 CSV 对我来说就像一种魅力,可以从 NTEXT 字段中获取巨大的文本值。
@ajeh:您使用的是哪个版本的 SSMS 2012?我刚刚使用我的 SSMS 2012(版本 11.0.5343.0)对其进行了测试(按照我在回答中描述的完全相同的步骤)并且它有效
但不要在 Excel 中打开,CSV 导入会再次截断数据。 :)
另存为制表符分隔的文本效果更好。 csv 格式将文本中的所有引号加倍。
导出为 CSV 会通过添加双引号破坏 JSON。通过在 2037 个字符后插入换行符(显然是最大行长),导出为 TAB 分隔符会破坏 JSON。似乎不可能让 SSMS 移交任何长度超过约 2000 个字符的 JSON。
i
iliketocode

快速技巧-

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

当列的内容实际上是 XML 时,这非常有效(没有 CDATA 部分)
这对我也有用,我有需要从 ms sql 中取出的 json 数据。
此外,内容是 XML 转义的。取出文本后,您应该使用 freeformatter.com 之类的工具将其取消转义。
这对我有用:``` DECLARE @g geography; ... 选择 Cast(@g.ToString() as xml); ```
这对我使用 SSMS v18 可以查看被其他解决方案截断的 250kb json 字符串。另外,我喜欢它,因为它为您提供了文本查看器的链接。 +!
E
Eugene Podskal

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

https://i.stack.imgur.com/9ZiYl.png

旧版本的 SSMS

Options (Query Results/SQL Server/Results to Grid Page)

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

...

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

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

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

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


正如 Remus 在他的回答中所写,存在限制,因为使用 MAX 定义的列中数据类型的最大存储大小为 2 GB,因此必须有一些限制,因为在 SSMS 中显示所有这些数据会很麻烦。
@IvanG - 不是真的。它可以像 XML 一样被超链接,单击它会在新窗口中打开它。我通常使用的解决方法是将其转换为 XML as here。 XML 数据可以设置为允许无限长度。
仅当字符数 < 65535 时才有效,这远低于 ntext 最大值。
@IvanG 甚至“结果到文件”也受到此限制的影响。
最新版本的 SSMS 中的限制要高得多。很好的解决方案!
A
Andrei Rantsevich

我已经为 SSMS 编写了一个插件,这个问题在那里得到了解决。您可以使用以下两种方式之一:

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

https://i.stack.imgur.com/qCCAb.png

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

https://i.stack.imgur.com/cD9QP.png


看起来像是一个非常有用的扩展,但我不能接受它作为答案,因为它需要商业产品(或试用版)。不过谢谢!
+1 不错的免费扩展程序,完美运行...谢谢!
谢谢,这正是我想要的。
不幸的是,从 2017 年 9 月 4 日起,SSMS Boost 不再免费(每个新版本发布的 30 天试用期除外)
这现在是一个商业产品,免费许可证不包含任何提到的功能,它们被禁用,你会弹出一个购买 PRO 版本的窗口。答案只是对他的软件的宣传。
d
dvlsc

以 XML 形式返回数据

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

https://i.stack.imgur.com/FlA0z.jpg

如果您返回的文本不包含会导致 XML 转换失败的未编码字符(例如 & 而不是 &amp;),这将起作用。

使用 PowerShell 返回数据

为此,您需要在运行命令的机器上安装 PowerShell SQL Server module

如果您已全部设置好,请配置并运行以下脚本:

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


迄今为止最简单的方法
t
takrl

我今天用这个方法成功了。它与其他答案类似,它也将内容转换为 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')

非常简单有效的解决方案。
d
dana

PowerShell 替代品

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

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

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 方法,但至少想在应得的地方给予赞扬。


C
CDenby

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

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


r
roncansan

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


D
Don G.

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

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

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

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


复制/粘贴截断数据。只有“将结果另存为...”选项才能正常工作
c
cfnerd

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

declare @t varchar(max)

select @t = long_column from table

print @t

但是文本仍然被截断:-(
是的,仍然被截断:(
而不是 pirnt @t 执行 select @t,您可以将 SSMS 输出窗口中的全文复制到 word 中。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅