從SQL Server 2005開始,引入了varchar(max) / nvarchar(max) 數據類型,表中可不使用LOB數據類型,從而突破單列8000 / 4000字符的限制,動態SQL也能夠拼接得更長;但查看這類字符的時候,在某些地方,字符長度的限制仍然存在,好比:sql
1. 單列:SSMS裏所返回的列值;工具
2. 動態SQL:print命令打印字符時;測試
一. SSMS裏所返回的列值長度限制spa
在SSMS (SQL Server Management Studio)的工具-選項(Tools-Options)裏可設置每列最多顯示的字符數,默認爲上限65535個字符,如圖:調試
注:到SQL Server Management Studio 17爲止,SSMS還並不能真正顯示65535個字符,經測試,正確值爲43679, 這是個已知bug,一直沒被修復,可簡單測試以下:code
if OBJECT_ID('test_print','U') is not null drop table test_print create table test_print(c1 varchar(max)) insert into test_print values(replicate(cast('A' as varchar(max)),65536)) select c1, len(c1) from test_print --c1 43679
若是想要查看更多,能夠把這個列導出爲文本文件、或者經過substring、或者轉爲XML格式來查看,以下:blog
select substring(c1,1,8000),SUBSTRING(c1,8001,16000) from test_print select c1 from test_print for XML PATH('')
二. PRINT命令打印字符長度限制get
print命令可用來打印字符,在調試存儲過程或者批處理時,常常會用到,但默認狀況下print有8000/4000字符的限制,以下:string
declare @nsql nvarchar(max) declare @test_sql varchar(50) set @nsql = replicate('A',4000) set @test_sql = replicate('B',50) print @nsql+@test_sql
注:RAISERROR也可用來打印,參數(severity)還可控制語句塊的行爲,可是RAISERROR的可打印字符長度僅爲2047,這包含超長時末尾的省略號(…),因此僅可打印2044個自定義字符it
declare @str varchar(max) set @str = replicate('A',9000) raiserror (@str,10,0)
若是想要打印更多,可經過如下幾種方法來突破字符數的限制:
1. 打印爲text/ntext類型,但仍有16002 字符數限制
DECLARE @info NVARCHAR(MAX) = 'A'; SET @info = REPLICATE(@info, 16000) + 'BC This is not printed'; PRINT @info; PRINT CAST(@info AS TEXT); PRINT CAST(@info AS NTEXT);
2. 使用XML類型,但只能用select而不是print
DECLARE @info NVARCHAR(MAX) = 'A'; SET @info = REPLICATE(@info, 16000) + 'BC This is not printed'; SELECT CAST(@info AS XML) SELECT @info for XML PATH('')
3. 使用substring來分段截取,封裝爲一個SP可直接使用,推薦
if OBJECT_ID('print_long','P') is not null drop proc print_long GO create proc print_long ( @str nvarchar(max) ) as begin DECLARE @Counter INT DECLARE @TotalPrints INT SET @Counter = 0 SET @TotalPrints = (LEN(@str) / 4000) + 1 WHILE @Counter < @TotalPrints BEGIN PRINT SUBSTRING(@str, (@Counter * 4000) + 1, 4000) SET @Counter = @Counter + 1 END --PRINT LEN(@str) end GO DECLARE @info NVARCHAR(MAX) = 'A'; SET @info = REPLICATE(@info, 16000) + 'BC This is not printed'; EXEC print_long @info
參考:
https://stackoverflow.com/questions/7850477/how-to-print-varcharmax-using-print-statement