01. SELECT显示和PRINT打印超长的字符

摘要:
从SQLServer2005开始,引入了varchar(max)/nvarchar(max)数据类型,表中可不使用LOB数据类型,从而突破单列8000/4000字符的限制,动态SQL也可以拼接得更长;但查看这类字符的时候,在某些地方,字符长度的限制仍然存在,比如:1.单列:SSMS里所返回的列值;2.动态SQL:print命令打印字符时;一.SSMS里所返回的列值长度限制在SSMS(SQLServ

从SQL Server 2005开始,引入了varchar(max) / nvarchar(max) 数据类型,表中可不使用LOB数据类型,从而突破单列8000 / 4000字符的限制,动态SQL也可以拼接得更长;但查看这类字符的时候,在某些地方,字符长度的限制仍然存在,比如:

1. 单列:SSMS里所返回的列值;

2. 动态SQL:print命令打印字符时;

. SSMS里所返回的列值长度限制

在SSMS (SQL Server Management Studio)的工具-选项(Tools-Options)里可设置每列最多显示的字符数,默认为上限65535个字符,如图:

01. SELECT显示和PRINT打印超长的字符第1张

注:到SQL Server Management Studio 17为止,SSMS还并不能真正显示65535个字符,经测试,正确值为43679, 这是个已知bug,一直没被修复,可简单测试如下:

if OBJECT_ID('test_print','U') is not null
    drop tabletest_print

create table test_print(c1 varchar(max))

insert intotest_print 
values(replicate(cast('A' as varchar(max)),65536))

select c1, len(c1) from test_print --65536

--用len检查复制出来的c1列字符,长度为43679
select len('AAA...AAA') --43679

如果想要查看更多,可以把这个列导出为文本文件(比如用bcp)、或者通过substring、或者转为XML格式来查看,如下:

select substring(c1,1,8000),SUBSTRING(c1,8001,16000) fromtest_print
select c1 from test_print for XML PATH('')

. PRINT命令打印字符长度限制

print命令可用来打印字符,在调试存储过程或者批处理时,经常会用到,但默认情况下print有8000/4000字符的限制,如下:

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个自定义字符

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 ASXML)
SELECT @info for XML PATH('')

3. 使用substring来分段截取,封装为一个SP可直接使用,推荐

if OBJECT_ID('print_long','P') is not null
    drop procprint_long
GO

create procprint_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

免责声明:文章转载自《01. SELECT显示和PRINT打印超长的字符》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微信小程序-上传多张图片加进度,持续修正中……URL的编码和解码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL内连接、左连接、右连接的使用以及区别

首先先建两个表,student表和score表 select * from student; student表数据如下: select * from score; score表数据如下: 可以看到students表中stu_id为16048008的记录对应score表没有数据; 1.内连接只显示两表中有关联的数据 select * from stud...

el-table表格树状图复选框全选问题

应用场景 表格数据有层级关系,需要用到表格的树状图结构!!!,同时,可全选表格数据,跟全勾选子节点数据,效果如下 实现方法 根据element官网实现,实现完,发现树形表格加复选框后,子结构无法选中的问题。于是在table上监听点击和全选,根据数据有子节点来手动切换选中与否。 解决方法如下: template如下: <el-table ref=...

结对项目:一寸时光APP(日程管理)二

建立数据库 package com.example.myapplication3.db; import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLi...

IOS开发NSString与int和float的相互转换以及字符串拼接、NSString、NSData、char* 类型之间的转换

一、NSString与int和float的相互转换 NSString *tempA = @"123"; NSString *tempB = @"456"; 1.字符串拼接 NSString *newString = [NSString stringWithFormat:@"%@%@",tempA,tempB]; 2.字符转intint intStr...

微信小程序创建自定义select组件(内含组件与父页面的交互流程)

 闲来无事将制作的select自定义组件制作贴出来,供大家借鉴,也可以为了以后的使用做个备注。 select是我自定义的组件,这个一定要记住,它是自定义组件! 以下书写select组件代码 其中的wxml如下 <view class="select_wrap"> <!-- 左边文字 --> <view class=...

日期选择器(Query+bootstrap和js两种方式)

日期选择是在下拉列表中选择年、月、日,年显示前后的五年,12个月,日就是有30、31、29、28天的区别,随着月份的变而变 一、js方式的日期选择 (1)首先就是三个下拉列表了,点击年、月、日显示列表中的内容,这样就是要给这三个列表加“点击事件”onclick <select onclick="biantian()"></select...