【问题标题】:How can I visualize the value of nvarchar(max), with max>65535, from SQL Server database? [duplicate]如何从 SQL Server 数据库中可视化 nvarchar(max) 的值,max>65535? [复制]
【发布时间】:2010-11-27 13:03:47
【问题描述】:

可能重复:
SQL Server Management Studio: Increase number of characters displayed in result set
更新:注意:该讨论包含标记为答案的错误答案。

来自 SQL Server 2008 R2 的 SSMS,允许在“结果到文本”模式下可视化最多 8192 个字符,在“结果到网格”模式下最多可视化 65535 个字符。 “Results to file”也会被截断。

我怎样才能快速便宜地查看大尺寸的选定值?

更新:
我看到了之前的讨论,最好的答案是创建自己的前端应用程序并不是一个真正的答案。
我不打算与 DBMS 客户端工具供应商竞争。
我只需要快速、肮脏或便宜地看到价值,无论是工具还是非工具。

我简直不敢相信,为了看到一个单一的价值,我应该创建客户端应用程序,并且没有任何技巧或方法。

【问题讨论】:

  • 我看到了这些链接,它们不包含任何答案。这个问题没有答案。
  • 你问这个问题已经快一个小时了。您可以编写一个简单的应用程序来查询该值并在大约 5 分钟内将其放入文本框中。寻找解决方法实际上是更有效地利用您的时间? (不,没有)

标签: sql sql-server select development-environment ssms


【解决方案1】:

为什么不直接将数据集返回为 XML 并且没有大小限制?您可以使用强制转换(COLUMN_NAME as XML)来执行此操作。

【讨论】:

  • 用有效的 XML '<root><![CDATA[' + COLUMN_NAME + ']]></root>' 包围列。注意:尽管有 CDATA 块,您可能仍需要将某些字符(如控制字符)替换为它们的 XML 等效项。
【解决方案2】:

又快又脏,我喜欢这样。当然,它可以在 Management Studio 中完成,您只需要有一点创意。这个想法很简单——不能显示整个字符串?将其切碎并显示更多行。 这是一个函数,它接受一个 varchar 输入并输出具有指定大小块的表。然后,您可以使用此功能从原始表格中进行交叉 APLLY 选择并获得所需的内容。

功能:

create function Splitter( @string varchar(max), @pieceSize int ) 
returns @t table( S varchar(8000) )
as
begin
    if ( @string is null or len(@string) = 0 )
        return

    set @pieceSize = isnull(@pieceSize, 1000)       
    if (@pieceSize < 0 or @pieceSize > 8000)
        set @pieceSize = 8000

    declare @i int = 0
    declare @len int = len(@string)

    while ( @i < @len / @pieceSize  )
    begin
        insert into @t(S) values(substring( @string, @i * @pieceSize + 1, @pieceSize))
        set @i = @i + 1
    end

    if (@len % @pieceSize) != 0
    begin
        if (@len / @pieceSize) = 0
            set @i = 1

        insert into @t(S) values(substring( @string, (@i - 1) * @pieceSize + 1, @len % @pieceSize ))
    end 
    return      
end



用法示例:

select t.ID, t.Col1, t.Col2, t.Col3, pieces.S
from dbo.MyTable as t
cross apply dbo.Splitter( t.MybigStringCol, 1000 ) as pieces

【讨论】:

    【解决方案3】:

    这就是问题所在,我在 sqlise 中攻击了 SQLPSX codeplex 项目的 PowerShell 模块(对不起,我只允许在超链接上使用,请谷歌搜索)。 PowerShell ISE 是集成脚本环境,它是 PowerShell V2 的一部分。 SQLPSX 是针对管理和查询 MS-SQLserver 的 PowerShell 模块的集合(以及对 ORACLE 的最低支持)。 ISE 的正常输出窗格有一些不好的截断/换行行为,但可以将输出发送到编辑器窗格。 当使用获取单列宽结果集的单行并使用“内联”或“isetab”作为输出格式的查询时,您将获得完整的 varchar(max)、文本、CLOB(是的,这也适用于 ORACLE)值. 如果您查询包含此类列的单行,则结果取决于嵌入的换行符,当前设置的宽度为 10000 个字符/行。但那是脚本语言,你可以自己修改。

    如果您更喜欢纯 T-SQL 解决方案,可以查看我的项目 Extreme T-SQL 脚本http://etsql.codeplex.com/ 的源代码。使用脚本 print_string_in_lines.sql 和 sp_gentextupdate.sql,您拥有生成更新脚本以将字段设置为当前内容的工具。需要 SQL-SERVER 2008,因为我在内部使用 varchar(max)。

    顺便说一句,我无权访问 SQL Server 2008 R2。我虽然限制仍然是每个文本列大约 4000 个字符。

    希望对你有帮助 伯恩德

    【讨论】:

      【解决方案4】:
      Select
          CASE WHEN T.TheSegment = 1 Then Cast(T.SomeID as varchar(50)) 
               Else '' 
          End as The_ID
          , T.ChoppedField
      From  (
         Select SomeID
             , 1 as TheSegment
             , substring(SomeBigField, 1, 8000) as ChoppedField
          from sometable
          Union All
          Select SomeID
             , 2
             , substring(SomeBigfield, 8001, 16000)
          from sometable
      ) as t
      order by t.SomeID, t.TheSegment;
      

      如有必要,在联合上冲洗并重复,或者随意获取递归;不确定您想阅读多少超过 16000 个字符。大约和它一样便宜。

      很多时候这些大字段包含格式化字符,因此创建您自己的表单和使用某种类型的富文本控件的建议是有效的。

      【讨论】:

        【解决方案5】:

        您可以通过在前端应用程序中查看它来查看它。 SSMS 并非设计为通用数据查看器。

        【讨论】:

        • SSMS 被设计为通用数据查看器。它专门针对 MSSQL,由于 MSSQL 支持大文本/blob,Management Studio 应该能够显示它们。 MS的某个人只是懒惰。
        • @Pavel:这是 SQL Server Management Studio,而不是 Data Visualization 工作室。我认为 SSMS 团队不需要花时间想出一种有效、可靠的方式来显示超大的文本块。
        • @Pavel - 不,SSMS 用于管理您的服务器,而不是可视化任意数据。
        • 并对您碰巧不同意的正确答案投反对票。认真的吗?
        • 这个问题不应该是它昨天设计的目的,而是它今天可以合理地做什么。在新版本的 SSMS 中不更改此限制实在是太可惜了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-22
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 2020-09-12
        • 1970-01-01
        相关资源
        最近更新 更多