如何从 SQL Server 数据库可视化 nvarchar(max) 的值,其中 max>65535?

3

可能重复:
SQL Server Management Studio:增加结果集中显示的字符数
更新:注意:该讨论包含错误答案标记为答案。

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

如何快速且廉价地查看更大尺寸的选定值?

更新:
我看到了之前的讨论,最好的答案是创建自己的前端应用程序,这并不是一个真正的答案。
我没有计划与DBMS客户端工具供应商竞争。
我只需要快速、简单或者便宜地查看值,无论是工具还是非工具都可以。

我简直无法相信,为了查看一个单一的值,我应该创建客户端应用程序,而没有任何技巧或方法可以绕过它。


相关:http://stackoverflow.com/questions/1908271/和https://dev59.com/-3NA5IYBdhLWcg3wdtld - Tomalak
我看了那些链接,它们没有包含任何答案。这个问题还没有被回答。 - Gennady Vanin Геннадий Ванин
1
你提出这个问题已经将近一个小时了。你本可以在大约5分钟内编写一个简单的应用程序来查询该值并将其投入文本框中。搜索解决方法实际上是更有效地利用您的时间?(而且,答案是没有解决方法) - Donnie
5个回答

13

为什么不直接将数据集返回为XML,这样就没有大小限制了呢?您可以使用 cast(COLUMN_NAME as XML) 来实现。

alt text


3
将该列用有效的XML包围起来 '<root><![CDATA[' + COLUMN_NAME + ']]></root>'。注意:尽管有CDATA块,您可能仍需要使用其XML等效字符替换某些字符(如控制字符)。 - Zarepheth

2

快速而简单,我喜欢这样的方式。当然可以在管理工具中完成,只需要有一点创意。这个想法很简单 - 无法显示整个字符串?将其分割并显示更多的行。

下面是一个函数,它接受一个varchar输入,并输出指定大小的块表。然后,您可以使用此函数从原始表中进行CROSS APPLY选择,并获得所需内容。

函数:

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

1
那就是问题所在,我攻击了SQLPSX代码库项目的PowerShell模块(抱歉,我只能使用一个超链接,请谷歌搜索它)。 PowerShell ISE是PowerShell V2的集成脚本环境。 SQLPSX是一组针对管理和查询MS-SQLserver(以及最小支持ORACLE)的PowerShell模块。 ISE的正常输出窗格具有一些不良的截断/换行行为,但可以将输出发送到编辑器窗格。 当使用查询获取单个行的一列宽结果集并使用“inline”或“isetab”作为输出格式时,您将获得完整的varchar(max),text,CLOB(是的,这也适用于ORACLE)值。 如果查询具有此类列的单个行,则结果取决于嵌入式换行符,当前设置为每行10000个字符/行。但这是在脚本语言中,您可以自己修改它。

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

顺便说一句,我没有访问SQL Server 2008 R2的权限。我认为限制仍然是每个文本列约4000个字符。

希望这有所帮助 Bernd


1
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个字符的内容。价格也很实惠。

很多时候,这些大字段包含了格式化字符,所以建议您自行创建表单并使用某种富文本控件是有效的。


0

您可以通过在前端应用程序中查看它来查看它。SSMS并不是一个通用的数据查看器。


2
SSMS被设计为通用的数据查看器。它专门针对MSSQL,由于MSSQL支持大型文本/二进制大对象,所以管理工具应该能够显示它们。微软公司的某个人只是有点懒而已。 - Pavel Urbančík
1
@Pavel:这是SQL Server 管理工作室,而不是数据可视化工作室。我认为SSMS团队没有必要花时间想出一种有效、可靠的方法来显示非常大的文本块。 - Adam Robinson
1
@Pavel - 不,SSMS是用于管理服务器的,而不是可视化任意数据。 - Donnie
你会因为个人不同意而对一个正确的答案进行负评吗?这是认真的吗? - Donnie
3
问题不应该是它昨天被设计用来做什么,而是今天它能合理地做什么。在新版本的SSMS中不改变这个限制只是一种遗憾。 - bernd_k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接