如何在SQL Server 2008 Management Studio中查看text或varchar(MAX)列的全部内容?


94

在此实时SQL Server 2008(内部版本10.0.1600)数据库中,有一个Events表,其中包含text名为的列Details。(是的,我意识到这实际上应该是一varchar(MAX)列,但是设置此数据库的人并没有那样做。)

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

我已经在Internet上的各个位置阅读过,可以将XML数据的“检索的最大字符数”设置Tools > Options > Query Results > SQL Server > Results To Grid为“无限”,然后执行如下查询:

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

(请注意,数据是列根本不是XML。CONVERT将列转换为XML只是我从Googling中发现的一种变通方法,其他人过去一直在绕过SSMS从a textvarchar(MAX)列中获取数据的限制。)

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

无法显示XML。发生以下错误:发生了意外的文件结尾。第5行,位置220160。

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

那么,关于如何访问此数据的任何想法吗?会转换列以varchar(MAX)解决我的问题吗?

Answers:


97

SSMS仅允许XML数据不受限制的数据。这不是默认设置,需要在选项中进行设置。

在此处输入图片说明

在非常有限的情况下可能会起作用的一个技巧就是简单地以如下所示的特殊方式命名列,以便将其视为XML数据。

DECLARE @S varchar(max) = 'A'

SET @S =  REPLICATE(@S,100000) + 'B' 

SELECT @S as [XML_F52E2B61-18A1-11d1-B105-00805F49916B]

在SSMS中(至少版本2012为当前的18.3),结果显示如下

在此处输入图片说明

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

但是,这确实存在一些重大问题。在查询中添加额外的列会破坏效果,并且多余的行都将与第一个连接在一起。最后,如果字符串包含诸如<打开XML查看器之类的字符,则将失败,并出现解析错误。

下面是一种更强大的方法,它可以避免SQL Server转换<&lt;etc或由于这些字符而失败的问题(在此引用Adam Adamhanic)。

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('')

2
将CDATA添加到Convert语句有效!非常感谢。:)
adamjford 2010年

添加CDATA可能有效,但是如果您的数据包含控制字符,则必须执行替换操作。就我而言,我在数据中使用了单位分隔符(ASCII代码31)。由于我只在多个地方使用了一个字符,因此只需一个简单的字符即可REPLACE(details, char(31), '&x1f;')。如果我有未知字符或要替换的大量其他字符,则可能不得不寻找其他解决方案。
Zarepheth 2014年

@Zarepheth-这CDATA是我的第一个建议。后一种AS [processing-instruction(x)]避免了这种情况。
马丁·史密斯

1
@MartinSmith很好的答案!想知道我从您的答案中学到了什么!+1
Kin Shah

50

我能够使它工作...

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

25

一种解决方法是右键单击结果集,然后选择“将结果另存为...”。这会将其与列的全部内容一起导出到CSV文件中。不完美,但对我来说足够好。

解决方法


10

您尝试过这种简单的解决方案吗?只有2次点击!

在查询窗口,

  1. 将查询选项设置为“结果网格”,运行查询
  2. 右键单击网格角处的结果选项卡,将结果另存为任何文件

您将获得要在文件中看到的所有文本!!!我可以看到varchar(MAX)字段的结果为130,556个字符

结果在文件中


1
直行-简单-一直被遗忘,直到您再次需要它为止:)
Dimi Takis

5

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

  1. 右键单击您的数据库,然后选择Tasks>Generate Scripts...
  2. 点击“简介”页面 Next
  3. “选择对象”页面
    1. 选择,Select specific database objects然后选择您的表。
    2. 请点击 Next
  4. “设置脚本选项”页面
    1. 将输出类型设置为 Save scripts to a specific location
    2. 选择Save to file并填写相关选项
    3. 点击Advanced按钮
    4. General> 设置Types of data to scriptData onlySchema and Data,然后单击确定
    5. 请点击 Next
  5. “摘要页面”单击下一步
  6. 您的sql脚本应基于在4.2中设置的选项生成。打开此文件并查看您的数据。

3

数据类型TEXT很旧,不应再使用,从TEXT列中选择数据很麻烦。

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

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

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

另请参见有关处理文本数据类型的本文


将转换该列以varchar(MAX)防止SSMS截断该列中的数据吗?
adamjford

我将首先使用SSMS生成脚本,以将TEXT列转换为varchar(max)。从那里可以评估是否要将其进一步转换为XML列。至于SSMS的显示限制,可以将网格结果设置为每列最多显示65,535个字符的非xml数据,最多可以显示无限数量的xml数据(仅供参考,XML类型的表列只能存储2 GB)。而文本的结果限制为每列8192个字符。要设置这些默认的最大限制,只需转到(在SSMS中)“工具”菜单,然后依次选择“选项...”,“查询结果”,“ SQL服务器”,“结果网格”或“结果文本”。
KM。

3

听起来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

然后,您将需要再次手动组合它们。

编辑

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

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

(我需要强制转换为varchar(max),因为replace函数将不适用于text列。应该没有任何理由无法将这些text列转换为varchar(max)。)


哦,我想我应该提到该列根本不是XML。从Googling中发现,将列转换为XML只是一种变通方法,其他人过去曾通过从OR textvarchar(MAX)列中检索数据来解决SSMS的限制。
adamjford

1
编辑上面的代码;使用Tally as(选择ROW_NUMBER()OVER(ORDER BY s1.id)-1作为sys.sysobjects中的Num作为s1交叉连接sys.sysobjects作为s2)选择Substring(T1.YourTextCol,T2.Num * 8000 + 1,8000)从YourTable中作为T1作为T2交叉加入理货,其中T2.Num <= Ceiling(datalength(T1.YourTextCol)/ 8000)由T2.Num排序
Ian Quigley

TSQL根据此答案使用@IanQuigley中的代码对我来说效果很好。我基本上得到了结果(最终是11条记录),然后将它们粘贴到了记事本中。工作完美。需要保存此脚本。我有一些疯狂的长XML,其中包含无效字符。
atconway 2013年

1

我更喜欢这种简单的XML hack,它使列在SSMS中可以逐个单元地单击。使用这种方法,您可以在SSMS的表格视图中快速查看数据,并在感兴趣的特定单元格上单击以查看完整值。除了避免XML错误之外,这与OP的技术相同。

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
;

请注意,某些字符在XML 1.0中无效,但在NVARCHAR/中有效VARCHAR。例如,NUL字符(NULL与字段的值不同)。具有此类嵌入值的字符串将强制转换。
宾基

1

从SSMS 18.2开始,您现在可以在网格结果中查看多达200万个字符。资源

允许显示更多数据(结果到文本)并存储在单元格中(结果到网格)。现在,SSMS允许两个字符最多2M个字符。

我用下面的代码验证了这一点。

DECLARE @S varchar(max) = 'A'

SET @S =  REPLICATE(@S,2000000) + 'B' 

SELECT @S as a

1
最大字符数实际上是2097152在SSMS版本15.0.18333.0中)。
造口

0

我想你真倒霉。该问题不是所有其他答案都关注的SQL问题,而仅仅是用户界面之一。Management Studio并非旨在成为通用/通用数据访问接口。它不是您的界面,而是您的管理区域,它在处理二进制数据和大型测试数据方面存在严重的限制-因为在指定的使用情况配置文件中使用它的用户不会遇到此问题。

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

唯一的选择是使用表值函数,该函数接受文本输入并为每一行剪切行,以便Management Studio获取行列表,而不是单行。


我觉得这个答案充其量只是猜测,还是您有“计划使用”的任何来源?如果它是SQL“管理工作室”,那么它至少应该能够向我展示数据库的内容。绝对糟糕的用户界面。
该死

由于该答案不再适用,应删除该答案
Caius Jard
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.