SQL Server截断和8192限制

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

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

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

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

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

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

剩下的步骤应该是自我解释的。 这将输出文件为文本,你可以在你最喜欢的文本编辑器中打开它。

我也使用XML,但是有一个稍微不同的方法来解决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数据”限制设置得足够高!

截图

我的解决scheme是有点绕了一下,但让我在那里(只要输出less于65535个字符)

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

更新 :为了演示这个工作,这里有一些SQLselect一个单一的100,000字符列。 如果将网格输出保存为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. 如果长列存储在本地variables中(如本例所示),或者从实际表中select它似乎没有什么区别

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

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

我正在使用SSMS 10,而我无法得到Torre的解决scheme。 导出向导不断思考input栏是一个图像:

“input列”XML_F52E2B61-18A1-11d1-B105-00805F49916B“(26)”的数据types是DT_IMAGE

如果给出一个select,我会让查询以“For XML Auto”或“For XML Raw”或“For XML explicit”的forms返回数据,这样的限制要高得多,你可以用更多的输出结果。

我通常使用XML来获取巨大的debuggingstring作为输出(使用Luke的testing工具):

  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; 

在SSMS中,如果您从一行中select数据,则只能使用less量的字符,但是如果您从一行中编辑数据,那么完整的值将会在那里。 它可能并不总是在那里,但如果你按ctrl-a,ctrl-c然后在编辑器中通过它将全部在那里。

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

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

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