55

在 SQL Server 2005 中,我试图查询一个 varchar(MAX) 列,其中一些行的文本数据超过 8192。然而,在 Management Studio 中,我在工具 --> 选项 --> 查询结果 --> 结果文本 --> 每列中显示的最大字符数 = 8192,这是最大值。因此,这些行的截断似乎只是由于文本输出所施加的限制。

我看到解决这个问题的唯一方法是使用 SUBSTRING 函数来抓取前 8000 个字符,然后是接下来的 8000 个字符等等。但这很丑陋且容易出错。

我应该提到 SSIS 和 BCP 不是我的选择。

有人有更好的建议吗?谢谢!

4

10 回答 10

76

您可以将数据导出到不会被截断的平面文件。去做这个:

  1. 右键单击数据库
  2. 单击任务 -> 导出数据
  3. 选择您的数据源(默认应该没问题)
  4. 为目标类型选择“平面文件目标”。
  5. 为输出选择一个文件名。
  6. 在“指定表复制或查询”上,选择“编写查询以指定要传输的数据”
  7. 粘贴到您的查询中

其余步骤应该是不言自明的。这会将文件输出为文本,您可以在您喜欢的文本编辑器中打开它。

于 2011-08-22T13:59:36.797 回答
29

我也使用 XML,但有一种稍微不同的方法可以解决 XML 实体化的大多数问题。

declare @VeryLongText nvarchar(max) = '';

SELECT top 100 @VeryLongText = @VeryLongText + '

' + OBJECT_DEFINITION(object_id) 
FROM sys.all_objects 
WHERE type='P' and is_ms_shipped=1

SELECT LEN(@VeryLongText)

SELECT @VeryLongText AS [processing-instruction(x)] FOR XML PATH('')

PRINT @VeryLongText /*WILL be truncated*/

确保 SSMS 中的“XML 数据”限制设置得足够高!

截屏

于 2011-04-01T01:06:16.273 回答
11

我的解决方案有点迂回,但让我到了那里(只要输出少于 65535 个字符)

  1. 在 SQL Management Studio 中,将网格结果的限制设置为 65535(工具 > 选项 > 查询结果 > SQL Server > 结果到网格 > 非 XML 数据)
  2. 运行查询,输出到网格
  3. 右键单击结果,选择“将结果另存为...”并将结果保存到文件
  4. 在记事本或类似工具中打开文件以获取输出

更新:为了证明这是可行的,这里有一些选择单个 100,000 个字符列的 SQL。如果我将网格输出保存到 csv 文件,则所有 100,000 个字符都在那里,没有截断。

DECLARE @test nvarchar(MAX), @i int, @line nvarchar(100)
SET @test = ''; SET @i = 100
WHILE @i < 100000
BEGIN
    SET @test = @test + STUFF(REPLICATE('_', 98) + CHAR(13) + CHAR(10), 1, LEN(CAST(@i AS nvarchar)), CAST(@i AS nvarchar))
    SET @i = @i + 100
END
SELECT @test

笔记:

  1. 正如我最初认为的那样,字符长度设置似乎没有任何区别。
  2. 我正在使用 SQL 2008 R2(服务器和 Management Studio)
  3. 如果长列存储在局部变量中(如本例所示)或从实际表中选择,似乎没有什么区别
于 2010-10-26T02:05:17.750 回答
9

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

在查询窗口中,

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

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

只需点击两下!

于 2017-12-05T22:55:00.023 回答
5

我在尝试导出 XML 时遇到了这个问题。这是我使用的解决方案:

选择“结果到网格”选项,右键单击“结果”窗格中显示的链接,然后选择“结果另存为”,选择“所有文件”文件类型,为文件命名并单击“保存”。所有 xml 数据都正确保存到文件中。

我正在使用 SSMS 10,但我无法让 Torre 的解决方案正常工作。导出向导一直认为输入列是图像:

“输入列“XML_F52E2B61-18A1-11d1-B105-00805F49916B”(26)的数据类型是DT_IMAGE

于 2014-09-04T18:05:33.537 回答
1

在 SSMS 中,如果您从一行中选择数据,则它仅限于少量字符,但如果您从一行中编辑数据,则完整的值将在那里。它可能并不总是在那里,但如果你按 ctrl-a、ctrl-c 然后在编辑器中将它过去,它就会全部存在。

于 2017-01-27T22:23:47.067 回答
0

您所说的截断只发生在 Management Studio 中。如果将列拉到另一个应用程序中,它不会被截断。

您无法使用查询分析器与 SQL Server 2005 对话。您是指 Management Studio 吗?

于 2009-06-04T18:28:11.120 回答
0

如果有一个选择,我会让查询将数据返回为“For XML Auto”或“For XML Raw”或“For XML explicit”,这样限制要高得多,您可以对输出的结果做更多​​的事情。

于 2009-06-04T18:57:47.477 回答
0

我通常使用 XML 来获取巨大的调试字符串作为输出(使用来自 Luke 的测试工具):

    declare @test nvarchar(max), @i int, @line nvarchar(100)
    set @test = ''; set @i = 100
    while @i < 100000
    begin
        set @test = @test + stuff(replicate('_', 98) + char(13) + char(10), 1, len(cast(@i as nvarchar)), cast(@i as nvarchar))
        set @i = @i + 100
    end
    -- ctrl+d for "results to grid" then click the xml output
    --select cast('<root>' + @test + '</root>' as xml)

-- revised
select @test for xml path(''), type;
于 2011-04-01T00:08:53.197 回答
0

另一种解决方法,使用HeidiSql进行这个棘手的查询。它没有视场长度的限制。

于 2017-02-14T12:10:27.553 回答