在 SQL Server Management Studio for SQL CE 数据库中查看所有 ntext 列文本

Posted

技术标签:

【中文标题】在 SQL Server Management Studio for SQL CE 数据库中查看所有 ntext 列文本【英文标题】:View all ntext column text in SQL Server Management Studio for SQL CE database 【发布时间】:2009-12-09 16:11:26 【问题描述】:

我经常想在 SQL Server Management Studio (SSMS) 中对大型文本列的值进行“快速检查”。在网格结果模式下,SSMS 允许您查看的最大字符数为 65535。(在文本结果模式下甚至更少。)有时我需要查看超出该范围的内容。使用 SQL Server 2005 数据库时,我经常使用将其转换为 XML 的技巧,因为 SSMS 可以让您以这种方式查看大量文本:

SELECT CONVERT(xml, MyCol) FROM MyTable WHERE ...

但是现在我使用的是 SQL CE,并且没有 Xml 数据类型。 Options 下还有一个“Maximum Characters Rereived XML”值;我想这在连接到其他数据源时很有用。

我知道我可以通过运行一个小控制台应用程序或其他东西来获得全部价值,但是 SSMS 中有没有办法查看整个 ntext 列的值?

[编辑]好的,这第一次没有引起太多关注(18 次浏览?!)。这不是一个大问题,但也许我只是沉迷于此。 必须有一些解决这个问题的好方法,不是吗?所以适度的赏金是活跃的。我愿意接受的答案,按从好到坏的顺序排列:

    一种与 SQL CE 中的 XML 技巧一样简单的解决方案。也就是说,完成这项工作的单个函数(转换、转换等)。 入侵 SSMS 以使其在结果中显示更多文本的不太侵入性的方法。 等效的 SQL 查询(可能是创造性地使用 SUBSTRING 并生成多个临时列??)来查看结果。

该解决方案应该适用于来自 SSMS 的 SQL CE 中任意长度的 nvarchar 和 ntext 列。有什么想法吗?

【问题讨论】:

转换成 xml 是个好技巧。 【参考方案1】:

如果您使用CE 3.5 supporting TOP and OUTER APPLY,请尝试以下语句:

SELECT texts.id, SUBSTRING(texts.text_column, number*100+1, 100)
FROM 
    (SELECT texts.id, texts.text_column, (99+LEN(texts.text_column))/100 AS l 
     FROM texts) AS texts
OUTER APPLY 
    (SELECT TOP(l) number 
     FROM master.dbo.spt_values val 
     WHERE name IS NULL 
     ORDER BY number) n

100(和 99)是我在数据中用于测试的文本长度。

【讨论】:

好主意。我不熟悉 OUTER APPLY 功能。不幸的是,该语句在 CE 中不起作用,可能是因为没有与主数据库等效的东西。但我明白发生了什么;也许还有另一种获取数字枚举的方法。 我认为这是最有希望的答案,所以我将其标记为答案。距离赏金到期还有一点时间,但我要去度假了...... :)【参考方案2】:

这可能不太理想,但您可以在以文本模式查看时将其分解吗?

例如:

SELECT
     SUBSTRING(my_text, 1, 8000),
     SUBSTRING(my_text, 8001, 8000)
FROM
     dbo.My_Table

它在 SQL 2008 中按原样工作。对于 2005 年,您可能需要对 VARCHAR(MAX) 进行 CAST,我不确定这是否会按预期工作。 p>

我刚刚在 2008 年提出了以下查询(我手边没有 CE 版本),它适用于大部分未知长度的文本(我认为限制为 800,000 个字符,你可能不想要无论如何都要显示)。这些块作为单独的行出现,因此您可能因此在文本中间有回车。我不知道这是否是一个问题。

;WITH my_cte AS
(
    SELECT
        SUBSTRING(my_text, 1, 8000) AS sub,
        SUBSTRING(my_text, 8001, LEN(CAST(my_text AS VARCHAR(MAX)))) AS remainder
    FROM
        dbo.Test_Text
    UNION ALL
    SELECT
        SUBSTRING(remainder, 1, 8000),
        SUBSTRING(remainder, 8001, LEN(remainder))
    FROM
        my_cte
    WHERE
        LEN(remainder) > 0
)
SELECT
    *
FROM
    my_cte

【讨论】:

很遗憾,CE 不支持 CTE。 SUBSTRING 是我能想到的最好的。对于大多数情况,这就足够了。在这一点上,这个问题更像是一个学术挑战......【参考方案3】:

根据http://msdn.microsoft.com/en-us/library/ms171931.aspx,您在 SQL CE 中使用 XML 类型很不走运。它根本不存在。你仍然会得到一个 2gb 的 BLOB ntext 字段,但这无济于事。

select ... as xml 在 ce 查询中工作,但看起来网格仍然将其截断为 ntext。要测试创建一个名为 Test 的表,其中 char 作为 nvarchar(4000),text 作为 ntext 字段。使用以下语句填充数据并返回:

select char, text from test as xml

insert into test (char, text) values (replicate('A',4000), replicate('b',4000) + replicate('B',4000))

我得到两个字段在网格模式下在大致相同的位置截断,这表明它在远小于 65535 处截断。删除 as xml 没有任何效果,因此它实际上并不会转到 XML 数据。

你的答案:

    不允许转换,但转换有效。问题:引擎中没有 xml 类型。可能的长期解决方法:将数据农场到 SQL Express 数据库临时,否则将获得正确的类型。除非您能应付开销,否则这可不是小事。 SSMS 正在变得可扩展,但我会说这是一个非首发。它是一个 .NET 应用程序,可以在 Reflector 中查看,但这并不意味着太多。 虽然是最糟糕的选择,但从 SSMS 的角度来看,它似乎是最简单的,但遗憾的是。您仍然需要自动调整每列的大小,但希望您不会将其分成超过 2-3 个。

然而,归根结底,我不禁认为所有这些仍然是浪费时间。也许您可以找到一个更好的仅限 SQL CE 的工具,您可以编辑架构以适当的方式查看每一列。有点遗憾,它甚至会变成这样,但我没有看到更简单的选择。

【讨论】:

【参考方案4】:

我喜欢这样(在调试模式下启动代码),执行 set 指令后,您可以从看到 @x 值的调试窗口复制大文本,单击放大镜/文本可视化工具:

declare @x varchar(max);

set @x = (select ioub_application_payload from integrator..tbl_interface_outbound where ioub_iz_id = 74)

PRINT (@x)

【讨论】:

这与 SQL 的 Print 有 8k 字符限制相同的问题。

以上是关于在 SQL Server Management Studio for SQL CE 数据库中查看所有 ntext 列文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server Management Studio 中注册 SQL Server 服务器?

SQL Server Management Studio (SSMS,SQL Server管理工具) 一直在加载程序包解决方案

如何使用 Windows 和 SQL 身份验证使用 SQL Server Management Studio 连接到 SQL Server

使用 SQL Server Management Studio 连接到 SQL Server

如何使用 SQL Server Management Studio (2008) 在 SQL Server Compact Edition 中创建列

在 SQL Server Management Studio 中更改 SQL Server 数据库中的列属性