2009-06-04 37 views
40

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

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

我应该提到SSIS和BCP不适合我。

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

+1

你所关注的输出是如何在查询分析器中显示?如果你只是用它来查看数据,那么我就不会太在意“容易出错”和“丑陋”的代码。如果您将其用于生产工作,那么这完全是另一个问题。 – 2009-06-04 18:23:37

+0

汤姆:我不只是看数据。我正在使用查询输出来为远程服务器生成新的存储过程调用,所以结果必须是“完美的”。 – 2009-06-04 18:26:07

+1

但为什么使用SSMS来执行查询?如果从程序执行相同的查询会发生什么? – 2009-06-04 18:48:37

回答

57

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

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

其余的步骤应该是不言而喻的。这会将文件输出到文本,并且可以在您最喜欢的文本编辑器中打开它。

0

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

您无法使用查询分析器与SQL Server 2005交谈。您的意思是Management Studio?

+0

我认为他确实是指管理工作室。 如果切换到“结果到网格”,它将每列的最大值显示为65535.不知道这是否会让你更接近 - 尽管 - 听起来像是在尝试在SQL中编写代码? – GalacticCowboy 2009-06-04 18:40:04

+0

对不起,我的意思是管理工作室。 – 2009-06-04 18:45:03

0

如果给一个选择,我将有查询返回的数据为“FOR XML AUTO”或“对于XML生”或“对于XML明确”这样的限制要高得多,你可以做的outputed更多结果。

+0

这也会截断输出... – 2010-09-15 11:15:07

4

我的解决方案是一个有点迂回的,但让我有 (只要输出小于65535个字符)

  1. 在SQL Management Studio中,设置网格效果发挥到极致65535(工具>选项>查询结果> SQL服务器>结果到网格>非XML数据)
  2. 运行查询,输出到电网
  3. 右键单击该结果,选择“保存结果为...”和将结果保存到文件中
  4. 打开该文件在记事本或类似得到输出

UPDATE:为了证明这个作品,这里的一些SQL是选择单个100000字符列。如果我将网格输出保存为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. 它似乎没有任何区别的字符长度设置是什么,我想orignally。
  2. 我正在使用SQL 2008 R2(包括服务器和Management Studio)
  3. 如果长列存储在局部变量中(如本例中所示)或从中选择实际的表
0

我通常使用XML来获得巨大的调试字符串输出(使用测试工具卢克):

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; 
25

我也使用XML,但a slightly different method说得到周围的大多数问题与XML entitisation。

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

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

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

我正在使用SSMS 10,我无法得到Torre的解决方案。导出向导一直在想输入列是一个图像:

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

0

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

0

另一个解决方法,使用HeidiSql这个棘手的查询。它在现场长度上没有限制。

2

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

在查询窗口,

  1. 集查询选项为“结果到网格”,运行查询
  2. 右键单击在网格边角结果选项卡上,结果保存为任何文件

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

Just Two Clicks away!