2009-06-04 83 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!