如何在 SQL Server Management Studio 中查看 NTEXT 或 NVARCHAR(max) 中的所有文本?默认情况下,它似乎只返回前几百个字符(255 个?),但有时我只想快速查看整个字段,而无需编写程序来完成。即使 SSMS 2012 仍然存在这个问题 :(
我能够从 NVARCHAR(MAX) 列中获取全文(99,208 个字符),方法是仅选择(结果到网格)该列,然后右键单击它,然后将结果保存为 CSV 文件。要查看结果,请使用文本编辑器(不是 Excel)打开 CSV 文件。有趣的是,当我尝试运行相同的查询但启用了Results to File 时,输出被使用Results to Text 限制截断。
@MartinSmith 描述为对(当前)接受的答案的评论的解决方法对我不起作用(尝试查看完整的 XML 结果时出错,抱怨“'[' 字符,十六进制值 0x5B,不能包含在名称中”)。
快速技巧-
SELECT CAST('<A><![CDATA[' + CAST(LogInfo as nvarchar(max)) + ']]></A>' AS xml)
FROM Logs
WHERE IDLog = 904862629
在较新版本的 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。
我已经为 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
以 XML 形式返回数据
SELECT CONVERT(XML, [Data]) AS [Value]
FROM [dbo].[FormData]
WHERE [UID] LIKE '{my-uid}'
https://i.stack.imgur.com/FlA0z.jpg
如果您返回的文本不包含会导致 XML 转换失败的未编码字符(例如 &
而不是 &
),这将起作用。
使用 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
参数设置为适合您需要的值。
我今天用这个方法成功了。它与其他答案类似,它也将内容转换为 XML,只是使用不同的方法。由于我没有看到答案中提到 FOR XML PATH
,我想我会添加它以保持完整性:
SELECT [COL_NVARCHAR_MAX]
FROM [SOME_TABLE]
FOR XML PATH(''), ROOT('ROOT')
这将提供一个有效的 XML,其中包含嵌套在外部 <ROOT></ROOT>
元素中的所有行的内容。各个行的内容都将包含在一个元素中,在本示例中,该元素称为 <COL_NVARCHAR_MAX>
。可以通过 AS
使用别名更改其名称。
&
、<
或 >
或类似的特殊字符将被转换为它们各自的实体。因此,您可能需要将 <
、>
和 &
转换回它们的原始字符,具体取决于您需要对结果执行什么操作。
编辑
我刚刚意识到 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')
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 方法,但至少想在应得的地方给予赞扬。
如果您只需要查看它,我使用了这个:
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 字符串。否则太难读了!
使用带有 sql server 插件的 Visual Studio 代码。对 json 超级有用
备选方案 1:右键单击以复制单元格并粘贴到文本编辑器中(希望支持 utf-8)
备选方案 2:右键单击并导出到 CSV 文件
备选方案 3:使用 SUBSTRING 函数可视化列的各个部分。例子:
SELECT SUBSTRING(fileXml,2200,200) 从 mytable WHERE id=123456
快速查看大型 varchar/text 列的最简单方法:
declare @t varchar(max)
select @t = long_column from table
print @t
pirnt @t
执行 select @t
,您可以将 SSMS 输出窗口中的全文复制到 word 中。