【问题标题】:How do I view the full content of a text or varchar(MAX) column in SQL Server 2008 Management Studio?如何在 SQL Server 2008 Management Studio 中查看 text 或 varchar(MAX) 列的完整内容?
【发布时间】:2010-05-03 16:58:44
【问题描述】:

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

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

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

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

(请注意,数据是列根本不是 XML。CONVERT将列转换为 XML 只是我从谷歌搜索中发现的一种解决方法,其他人用来绕过 SSMS 从 @ 检索数据的限制987654328@ 或varchar(MAX) 专栏。)

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

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

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

那么,知道如何访问这些数据吗?将列转换为 varchar(MAX) 可以解决我的问题吗?

【问题讨论】:

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


    【解决方案1】:

    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 将< 转换为< 等问题或由于这些字符而失败的更强大的方法如下 (credit Adam Machanic here)。

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

    【讨论】:

    • 将 CDATA 添加到 Convert 语句有效!非常感谢。 :)
    • 添加CDATA 可能有效,但如果您的数据包含控制字符,则必须执行替换操作。就我而言,我在数据中使用了单位分隔符 ASCII 代码 31。因为我在很多地方只使用了那个字符,所以一个简单的REPLACE(details, char(31), '&x1f;') 就足够了。如果我有未知字符或大量不同的字符要替换,我可能不得不寻找其他解决方案。
    • @Zarepheth - CDATA 是我的第一个建议。 AS [processing-instruction(x)] 的后一个避免了这种情况。
    • @MartinSmith 很好的答案!想知道我从你的回答中学到了多少! +1
    • SSMS 设置有效!我确实需要重新启动 SSMS (18.9.2) 才能使更改生效。
    【解决方案2】:

    我能够让它工作......

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 除非进行了上述配置,否则不会导出全部内容。
      【解决方案4】:

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

      在查询窗口,

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

      你会得到你想在文件中看到的所有文本!!!我可以看到 varchar(MAX) 字段的结果有 130,556 个字符

      【讨论】:

      • 直 - 简单 - 在你再次需要它之前总是被遗忘:)
      【解决方案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 script 设置为Data onlySchema and Data 并点击确定
        5. 点击Next
      5. “摘要页面”点击下一步
      6. 您的 sql 脚本应该根据您在 4.2 中设置的选项生成。打开此文件并查看您的数据。

      【讨论】:

        【解决方案6】:

        数据类型 TEXT 太旧了,不应该再使用了,从 TEXT 列中选择数据很痛苦。

        ntext, text, and image (Transact-SQL)

        ntext、text 和 image 数据类型 将在未来版本中删除 微软 SQL 服务器。避免使用 新开发的这些数据类型 工作,并计划修改应用程序 目前使用它们。采用 nvarchar(max)、varchar(max) 和 varbinary(max) 代替。

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

        另请参阅Handling The Text Data Type 上的这篇文章。

        【讨论】:

        • 将列转换为varchar(MAX) 会阻止 SSMS 截断其中的数据吗?
        • 我将首先使用 SSMS 生成脚本以将您的 TEXT 列转换为 varchar(max)。从那里您可以评估是否要进一步将其转换为 XML 列。至于 SSMS 显示限制,可以将结果到网格设置为每列最多显示 65,535 个字符的非 xml 数据,以及最多无限量的 xml 数据(仅供参考,XML 类型的表列只能存储 2 GB)。虽然结果文本限制为每列 8192 个字符。要设置这些默认的最大限制,只需转到(在 SSMS 中)工具菜单,然后是选项...,然后是查询结果,然后是 SQL 服务器,然后是结果到网格或结果到文本。
        【解决方案7】:

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

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

        编辑

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

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

        (我需要转换为 varchar(max),因为替换功能不适用于 text 列。应该没有任何理由不能将这些 text 列转换为 varchar(max)。)

        【讨论】:

        • 哦,我想我应该提到该列根本不是 XML。将列转换为 XML 只是我从谷歌搜索中发现的一种解决方法,其他人用来绕过 SSMS 从textvarchar(MAX) 列中检索数据的限制。
        • 编辑上面的代码;使用 Tally As ( Select ROW_NUMBER() OVER ( ORDER BY s1.id ) - 1 As Num From sys.sysobjects As s1 Cross Join sys.sysobjects As s2 ) Select Substring (T1.YourTextCol, T2.Num * 8000 + 1, 8000) From YourTable As T1 Cross Join Tally As T2 where T2.Num
        • 根据这个答案使用来自@IanQuigley 的TSQL 对我来说效果很好。我基本上把结果(最终是 11 条记录)然后将它们粘贴到记事本中。工作完美。需要保存这个脚本。我有一些包含无效字符的疯狂长 XML。
        【解决方案8】:

        我认为你运气不好。这个问题不是所有其他答案似乎都关注的 SQL 级别问题,而只是用户界面之一。 Management Studio 并不是一个通用/通用数据访问接口。它不是你的界面,而是你的管理区域,它在处理二进制数据和大型测试数据时有严重的限制——因为在指定的使用配置文件中使用它的人不会遇到这个问题。

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

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

        【讨论】:

        • 我觉得这个答案充其量只是猜测,或者你有任何“计划使用”的来源吗?如果它是一个 SQL“管理工作室”,它至少应该能够向我展示我的数据库的内容。绝对糟糕的用户界面。
        • 这个答案应该被删除,因为它不再适用
        【解决方案9】:

        我更喜欢这种简单的 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
        ;
        

        【讨论】:

        • 请注意,有些字符在 XML 1.0 中无效,但在 NVARCHAR/VARCHAR 中有效。例如,NUL 字符(不同于作为字段值的NULL)。对于具有此类嵌入值的字符串,强制转换将失败。
        【解决方案10】:

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

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

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

        DECLARE @S varchar(max) = 'A'
        
        SET @S =  REPLICATE(@S,2000000) + 'B' 
        
        SELECT @S as a
        

        【讨论】:

        • 最大字符数实际上是 2097152在 SSMS 版本 15.0.18333.0 中)。
        猜你喜欢
        • 1970-01-01
        • 2022-01-14
        • 2010-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多