SQL Server截断和8192限制
在SQL Server 2005中,我试图查询一个varchar(MAX)列,其中有一些行的文本数据超过了8192.然而,在pipe理工作室我有工具 – >选项 – >查询结果 – >结果文本 – >每列显示的最大字符数= 8192 ,最大值。 因此,似乎这些行上的截断仅仅是由于文本输出所施加的限制而发生的。
我看到解决这个问题的唯一方法就是使用SUBSTRING函数来抓取第一个8000个字符,然后是下一个8000个字符等等。但是这很丑陋,容易出错。
我应该提到SSIS和BCP不适合我。
有没有人有更好的build议? 谢谢!
您可以将数据导出到不会被截断的平面文件。 去做这个:
- 右键单击数据库
- 点击任务 – >导出数据
- select你的数据源(默认值应该没问题)
- 为目标typesselect“平面文件目标”。
- 为输出select一个文件名。
- 在“指定表复制或查询”上,select“写入查询指定要传输的数据”
- 粘贴到您的查询
剩下的步骤应该是自我解释的。 这将输出文件为文本,你可以在你最喜欢的文本编辑器中打开它。
我也使用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个字符) :
-
在SQL Management Studio中,将网格结果的限制设置为65535(工具>选项>查询结果> SQL Server>结果到网格>非XML数据) - 运行查询,输出到网格
- 右键单击结果,select“将结果另存为…”并将结果保存到文件中
- 以记事本或类似的方式打开文件,获得输出
更新 :为了演示这个工作,这里有一些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
笔记:
- 我认为,字符长度的设定似乎没有什么区别。
- 我正在使用SQL 2008 R2(包括服务器和Management Studio)
- 如果长列存储在本地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?