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

时间:2012-08-10 08:26:51

标签: sql-server sql-server-2008 tsql ssms

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

10 个答案:

答案 0 :(得分:175)

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

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

答案 1 :(得分:103)

快速技巧:

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

答案 2 :(得分:79)

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

  
    

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

  

...

  
    

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

  

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

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

  
    

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

  

答案 3 :(得分:51)

我已经为SSMS写了一个加载项,这个问题在那里修复了。您可以使用以下两种方法之一:

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

http://www.ssmsboost.com/Features/ssms-add-in-copy-results-grid-cell-contents-line-with-breaks Copy original cell contents

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

(功能允许在任何外部应用程序中打开字段内容,因此如果您知道它是文本 - 您使用文本编辑器打开它。如果内容是带图片的二进制数据 - 您选择视图作为图片。下面的示例显示打开图片):SSMS Results grid visualizers

答案 4 :(得分: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字符串。否则很难阅读!

答案 5 :(得分:0)

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

declare @t varchar(max)

select @t = long_column from table

print @t

答案 6 :(得分:0)

尝试一下:

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

请确保根据期望的结果在SSMS选项窗口中设置合理的限制。 enter image description here

答案 7 :(得分:0)

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

替代2 :右键单击并导出到CSV文件

替代3 :使用SUBSTRING功能可显示该列的各个部分。示例:

  

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

答案 8 :(得分:0)

我今天用这种方法成功了。它与其他答案相似,只是将内容转换为XML,仅使用其他方法即可。因为我没有在答案中提到FOR XML PATH,所以我想添加它是为了完整性:

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

这将提供有效的XML,该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')

答案 9 :(得分:0)

PowerShell替代

这是一篇旧文章,我已仔细阅读答案。不过,我发现输出没有SSMS更改的多行大文本字段还是有些痛苦。我最终为自己的需要编写了一个小型C#程序,但不得不考虑可以使用命令行来完成。事实证明,使用PowerShell相当容易。

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

Install-Module -Name SqlServer

使用Invoke-Sqlcmd来运行查询:

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

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

$Rows[0].BigColumn

或输出到文件,如下所示:

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

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

编辑:事实证明@dvlsc给出了一个答案,该答案将该方法描述为辅助解决方案。我认为,因为它被列为次要答案,这是我首先错过它的原因。我将离开我的答案,重点放在PowerShell方法上,但至少要在应有的位置给予赞赏。