SQL Server截断和8192限制

时间:2009-06-04 18:19:01

标签: sql-server truncation

在SQL Server 2005中,我试图查询varchar(MAX)列,其中包含一些文本数据超过8192的行。但是,在管理工作室中我有工具 - >选项 - >查询结果 - >结果到文本 - >每列中显示的最大字符数= 8192 ,这是最大值。因此,看起来这些行的截断仅仅是由于文本输出所施加的限制。

我唯一能看到的就是使用SUBSTRING函数来获取前8000个字符,然后是接下来的8000个字符等等。但这很难看并且容易出错。

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

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

10 个答案:

答案 0 :(得分:64)

您可以将数据导出到不会被截断的平面文件中。要做到这一点:

  1. 右键单击数据库
  2. 点击任务 - >导出数据
  3. 选择您的数据源(默认值应该没问题)
  4. 为目标类型选择“平面文件目的地”。
  5. 选择输出的文件名。
  6. 在“指定表格复制或查询”中,选择“编写查询以指定要传输的数据”
  7. 粘贴您的查询
  8. 其余步骤应该是自我解释的。这会将文件输出到文本,您可以在您喜欢的文本编辑器中打开它。

答案 1 :(得分:27)

我也使用XML但a slightly different method解决了大多数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数据”限制设置得足够高!

Screenshot

答案 2 :(得分:4)

我的解决方案有点圆,但让我在那里(只要输出小于65535个字符)

  1. 在SQL Management Studio中,将网格结果的限制设置为65535(工具>选项>查询结果> SQL Server>结果到网格>非XML数据)
  2. 运行查询,输出到网格
  3. 右键单击结果,选择“将结果另存为...”并将结果保存到文件
  4. 在记事本或类似文件中打开文件以获取输出
  5. 更新:为了证明这是有效的,这里有一些选择单个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. 如果长列存储在局部变量中(如本示例中所示)或从实际表中选择
    4. ,则似乎没有区别

答案 3 :(得分:4)

我试图导入XML。这是我使用的解决方案:

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

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

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

答案 4 :(得分:3)

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

在查询窗口,

  1. 将查询选项设置为“结果到网格”,运行查询
  2. 右键单击网格角的结果选项卡,将结果保存为任何文件
  3. 您将获得要在文件中看到的所有文本!我的varchar(MAX)字段结果可以看到130,556个字符

    Just Two Clicks away!

答案 5 :(得分:0)

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

你无法使用查询分析器与SQL Server 2005交谈。你的意思是管理工作室吗?

答案 6 :(得分:0)

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

答案 7 :(得分: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;

答案 8 :(得分:0)

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

答案 9 :(得分:0)

另一种解决方法是,使用HeidiSql进行此棘手的查询。它在字段长度上没有限制。