01. SELECT顯示和PRINT打印超長的字符

從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

相關文章
相關標籤/搜索