代码之家  ›  专栏  ›  技术社区  ›  Ash Machine

SQL Server截断和8192限制

  •  43
  • Ash Machine  · 技术社区  · 16 年前

    在SQLServer2005中,我试图查询一个varchar(max)列,其中有些行的文本数据超过8192。然而,在管理工作室里 工具-->选项-->查询结果-->结果转换为文本-->每列中显示的最大字符数=8192 ,这是最大值。因此,似乎只有在文本输出所施加的限制下才会截断这些行。

    我看到的唯一解决这个问题的方法是使用子字符串函数来抓取,比如说前8000个字符,然后是后8000个字符等等,但是这很难看,而且容易出错。

    我应该提到,ssis和bcp对我来说不是选项。

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

    10 回复  |  直到 7 年前
        1
  •  63
  •   Torre Lasley    13 年前

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

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

    剩下的步骤应该是不言而喻的。这将把文件输出为文本,你可以在你最喜欢的文本编辑器中打开它。

        2
  •  27
  •   Martin Smith    14 年前

    我也使用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

        3
  •  4
  •   Luke Sampson    14 年前

    我的解决方案有点圆滑,但把我带到了那里 (只要输出少于65535个字符) :

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

    更新 :为了证明这是可行的,下面是一些选择单个100000字符列的SQL。如果我将网格输出保存到一个csv文件中,所有100000个字符都不会被截断。

    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
  •  4
  •   Cindy Conway    10 年前

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

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

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

    “输入列”xml_f52e2b61-18a1-11d1-b105-00805f499116b“(26)”的数据类型为dt_image

        5
  •  3
  •   Jenna Leaf    7 年前

    你尝试过这个简单的解决方案吗?只需点击两下!

    在查询窗口中,

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

    你将得到你想在文件中看到的所有文本!!!!对于varchar(max)字段的结果,我可以看到130556个字符

    Just Two Clicks away!

        6
  •  0
  •   Avitus    16 年前

    如果给我一个选择,我将让查询返回“for xml auto”或“for xml raw”或“for xml explicit”这样的数据,这样限制就更高了,您可以对输出的结果做更多的工作。

        7
  •  0
  •   nathan_jr    14 年前

    我通常使用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
  •   Larry K    8 年前

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

        9
  •  0
  •   cpsaez    8 年前

    另一个解决方法,使用 HeidiSql 对于这个棘手的问题。它没有字段长度的限制。

        10
  •  0
  •   Bridge user2173966    8 年前

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

    您无法使用查询分析器与SQLServer2005进行对话。你是说管理工作室吗?