在SQL Server 2005中,我试图查询varchar(MAX)列,其中包含一些文本数据超过8192的行。但是,在管理工作室中我有工具 - >选项 - >查询结果 - >结果到文本 - >每列中显示的最大字符数= 8192 ,这是最大值。因此,看起来这些行的截断仅仅是由于文本输出所施加的限制。
我唯一能看到的就是使用SUBSTRING函数来获取前8000个字符,然后是接下来的8000个字符等等。但这很难看并且容易出错。
我应该提到SSIS和BCP不是我的选择。
有人有更好的建议吗?谢谢!
答案 0 :(得分:64)
您可以将数据导出到不会被截断的平面文件中。要做到这一点:
其余步骤应该是自我解释的。这会将文件输出到文本,您可以在您喜欢的文本编辑器中打开它。
答案 1 :(得分:27)
我也使用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数据”限制设置得足够高!
答案 2 :(得分:4)
我的解决方案有点圆,但让我在那里(只要输出小于65535个字符):
更新:为了证明这是有效的,这里有一些选择单个100,000字符列的SQL。如果我将网格输出保存到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
注意:
答案 3 :(得分:4)
我试图导入XML。这是我使用的解决方案:
选择“结果到网格”选项,右键单击“结果”窗格中显示的链接,然后选择“将结果另存为”,选择“所有文件”文件类型,为文件命名并单击“保存”。所有xml数据都正确保存到文件中。
我正在使用SSMS 10,我无法让Torre的解决方案起作用。导出向导一直认为输入列是图像:
“输入列”XML_F52E2B61-18A1-11d1-B105-00805F49916B“(26)”的数据类型为DT_IMAGE
答案 4 :(得分:3)
你试过这个简单的解决方案吗?只需点击2次!
在查询窗口,
答案 5 :(得分:0)
您所谈论的截断只发生在Management Studio中。如果您将列拉入另一个应用程序,它将不会被截断。
你无法使用查询分析器与SQL Server 2005交谈。你的意思是管理工作室吗?
答案 6 :(得分:0)
如果给出了一个选择,我会让查询返回数据为“For XML Auto”或“For XML Raw”或“For XML explicit”,这样的限制要高得多,你可以用输出的结果做更多的事情
答案 7 :(得分:0)
我通常使用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)
在SSMS中,如果从行中选择数据,则仅限于少量字符,但如果从行中编辑数据,则完整值将存在。它可能并不总是存在,但如果你按ctrl-a,ctrl-c然后在编辑器中将它过去它将会存在。
答案 9 :(得分:0)
另一种解决方法是,使用HeidiSql进行此棘手的查询。它在字段长度上没有限制。