如何在SQL Server 2008 Management Studio中查看文本或varchar(MAX)列的完整内容?

在这个实时SQL Server 2008(build 10.0.1600)数据库中,有一个Events表,其中包含一个名为Detailstext列。 (是的,我意识到这实际上应该是一个varchar(MAX)列,但是设置这个数据库的人不这样做。)

此列包含非常大的exception日志和关联的JSON数据,我尝试通过SQL Server Management Studio访问,但是每当我将结果从网格复制到文本编辑器时,它都会将其截断为43679个字符。

我已经阅读了互联网上的各个位置,您可以在Tools > Options > Query Results > SQL Server > Results To Grid to Unlimited中为XML数据设置最大字符数,然后执行如下查询:

 select Convert(xml, Details) from Events where EventID = 13920 

(请注意,数据是列根本不是XML。将列CONVERT为XML仅仅是我从Google上find的一个解决方法,其他人已经习惯了解SSMS从textvarchar(MAX)获取数据的限制,柱。)

但是,设置上面的选项后,运行查询,然后单击结果中的链接,我仍然得到以下错误:

无法显示XML。 发生以下错误:发生意外的文件结束。 5号线,位置220160。

一种解决方法是增加从服务器检索XML数据的字符数。 要更改此设置,请在“工具”菜单上,单击“选项”。

那么, 有关如何访问这些数据的想法呢? 将列转换为varchar(MAX)修复我的困境?

一个可能在相当有限的情况下工作的技巧就是用下面的特殊方式来命名该列。

 DECLARE @S varchar(max) = 'A' SET @S = REPLICATE(@S,100000) + 'B' SELECT @S as [XML_F52E2B61-18A1-11d1-B105-00805F49916B] 

在SSMS 2012和2014中,显示的结果如下

在这里输入图像描述

点击它可以在XML查看器中打开完整的结果。 向右滚动显示B的最后一个字符被保留,

但是,这确实有一些重大的问题。 在查询中添加额外的列会影响效果,并且多余的行都会与第一列连接起来。 最后,如果string包含<打开XML查看器等字符时出现parsing错误。

这样做的更健壮的方式避免了SQL Server转换< to &lt; 或由于这些字符故障是低于( 信贷亚当Machanic在这里 )。

 DECLARE @S varchar(max) SELECT @S = '' SELECT @S = @S + ' ' + OBJECT_DEFINITION(OBJECT_ID) FROM SYS.PROCEDURES SELECT @S AS [processing-instruction(x)] FOR XML PATH('') 

我能够得到这个工作…

 SELECT CAST('<![CDATA[' + LargeTextColumn + ']]>' AS XML) FROM TableName; 

一个解决方法是右键单击结果集并select“另存为…”。 这将其导出到包含整个列的内容的CSV文件中。 不完美,但为我工作得不错。

解决方法

我find的最简单的解决方法是备份表并查看脚本。 去做这个

  1. 右键单击您的数据库并selectTasks > Generate Scripts...
  2. “介绍”页面单击Next
  3. “select对象”页面
    1. selectSelect specific database objects并select你的表。
    2. 点击Next
  4. “设置脚本选项”页面
    1. 将输出types设置为Save scripts to a specific location
    2. selectSave to file并填写相关选项
    3. 点击Advancedbutton
    4. General > Types of data to script设置为Data onlySchema and Data ,然后单击确定
    5. 点击Next
  5. “摘要页面”点击下一步
  6. 你的sql脚本应该根据你在4.2中设置的选项来生成。 打开这个文件并查看你的数据。

数据typesTEXT是旧的,不应该再使用,从TEXT列中select数据是一种痛苦。

ntext,文本和图像(Transact-SQL)

ntext,文本和图像数据types将在未来版本的Microsoft SQL Server中删除。 避免在新的开发工作中使用这些数据types,并计划修改当前正在使用它们的应用程序。 改用nvarchar(max),varchar(max)和varbinary(max)。

您需要使用TEXTPTR(Transact-SQL)来检索文本数据。

另请参阅有关处理文本数据types的文章 。

这听起来像Xml可能不完整。 如果是这种情况,那么您将无法将其转换为Xml,因此您在Management Studio中可以返回的文本数量有限。 但是,您可以将文本分解为更小的块,如下所示:

 With Tally As ( Select ROW_NUMBER() OVER ( ORDER BY s1.object_id ) - 1 As Num From sys.sysobjects As s1 Cross Join sys.sysobjects As s2 ) Select Substring(T1.textCol, T2.Num * 8000 + 1, 8000) From Table As T1 Cross Join Tally As T2 Where T2.Num <= Ceiling(Len(T1.textCol) / 8000) Order By T2.Num 

您将需要再次手动合并它们。

编辑

这听起来像在Xmlparsing器不喜欢的text数据中有一些字符。 您可以尝试将这些值转换为实体,然后尝试Convert(xml, data)技巧。 所以像这样:

 Update Table Set Data = Replace(Cast(Data As varchar(max)),'<','&lt;') 

(我需要转换为varchar(max),因为replace函数在text列上不起作用,不应该有任何理由不能将这些text列转换为varchar(max) 。)

我想,你运气不好。 这个问题不是SQL级别的问题,因为所有其他答案似乎都集中在这个问题上,而只是其中的一个用户界面。 Management Studio并不意味着成为通用数据访问接口。 这不是您的界面,而是您的pipe理区域,它在处理二进制数据和大量testing数据方面存在严重的限制 – 因为在指定的使用情况configuration文件中使用它的人不会遇到这个问题。

呈现大量的文本数据根本不是计划的用法。

您唯一的select将是一个表值函数,它接受文本input并为每一行剪切行,以便Management Studio获取行列表,而不是单行。

我更喜欢这个简单的XML hack,它使得SSMS中的列可以在单元的基础上单击。 使用这种方法,您可以在SSMS的表格视图中快速查看您的数据,并在特定单元格点击以查看有趣的全部值。 这与OP的技术相同,只是它避免了XML错误。

 SELECT e.EventID ,CAST(REPLACE(REPLACE(e.Details, '&', '&amp;'), '<', '&lt;') AS XML) Details FROM Events e WHERE 1=1 AND e.EventID BETWEEN 13920 AND 13930 ;