sql server截断和8192限制

8e2ybdfx  于 2021-07-24  发布在  Java
关注(0)|答案(10)|浏览(338)

在SQLServer2005中,我试图查询一个varchar(max)列,该列的某些行的文本数据超过了8192。然而,在managementstudio中,我在tools-->options-->query results-->results to text-->max number of characters displayed in each column=8192(这是一个最大值)。因此,对这些行的截断似乎只是由于文本输出所施加的限制。
我看到的唯一能绕过这个问题的方法是使用子串函数来抓取前8000个字符,然后再抓取下8000个字符等等。但是这很难看,而且容易出错。
我应该提到ssis和bcp不是我的选择。
有人有更好的建议吗?谢谢!

50pmv0ei

50pmv0ei1#

您可以将数据导出到不会被截断的平面文件中。为此:
右键单击数据库
单击任务->导出数据
选择您的数据源(默认值可以)
选择“平面文件目标”作为目标类型。
为输出选择一个文件名。
在“指定表副本或查询”中,选择“编写查询以指定要传输的数据”
粘贴到查询中
剩下的步骤应该不言自明。这将把文件输出为文本,你可以在你喜欢的文本编辑器中打开它。

zi8p0yeb

zi8p0yeb2#

我也使用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数据”限制设置得足够高!

5t7ly7z5

5t7ly7z53#

我的解决方案有点周而复始,但让我达到了目的(只要输出少于65535个字符):
在sql management studio中,将网格结果的限制设置为65535(工具>选项>查询结果>sql server>结果到网格>非xml数据)
运行查询,输出到网格
右键单击结果,选择“将结果另存为…”,然后将结果保存到文件中
在记事本或类似工具中打开文件以获取输出
更新:为了证明这是可行的,这里有一些sql选择一个100000字符的列。如果我将网格输出保存到一个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

笔记:
正如我最初所想,字符长度的设置似乎没有任何区别。
我使用的是sql2008r2(服务器和managementstudio)
如果长列存储在局部变量中(如本例所示),或者从实际的表中选择,似乎没有什么区别

8xiog9wr

8xiog9wr4#

你试过这个简单的方法吗?只需点击2下!
在查询窗口,
将查询选项设置为“结果到网格”,运行查询
右键单击网格角的“结果”选项卡,将结果另存为任何文件
你将得到所有的文本,你想看到的文件!!!对于varchar(max)字段的结果,我可以看到130556个字符

omjgkv6w

omjgkv6w5#

我在尝试导出xml时遇到了这个问题。这是我使用的解决方案:
选择“结果到网格”选项,右键单击“结果”窗格中显示的链接,然后选择“结果另存为”,选择“所有文件”文件类型,为文件命名,然后单击“保存”。所有xml数据都正确地保存到一个文件中。
我用的是ssms10,但我不能让托瑞的解决方案起作用。导出向导一直认为输入列是图像:
“input column”xml_f52e2b61-18a1-11d1-b105-00805f49916b“(26)”的数据类型是dt_image

pftdvrlh

pftdvrlh6#

在ssms中,如果您从一行中选择数据,它将被限制为少量字符,但如果您编辑一行中的数据,则会出现完整值。它可能并不总是在那里,但是如果你按ctrl-a,ctrl-c然后在编辑器中通过它,它就会全部在那里。

quhf5bfb

quhf5bfb7#

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

zour9fqk

zour9fqk8#

我通常使用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;
68bkxrlz

68bkxrlz9#

另一个解决方法是,使用heidisql来处理这个棘手的查询。它没有野外长度的限制。

7qhs6swi

7qhs6swi10#

您所说的截断只发生在managementstudio中。如果您将列拉入另一个应用程序,它将不会被截断。
您不可能使用查询分析器与SQLServer2005对话。你是说管理工作室吗?

相关问题