从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个字符,如图:

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

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格式来查看,如下:

select substring(c1,1,8000),SUBSTRING(c1,8001,16000) from test_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 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

01. SELECT显示和PRINT打印超长的字符的更多相关文章

  1. 【原创】python中文编码问题深入分析(二):print打印中文异常及显示乱码问题分析与解决

    在学习python以及在使用python进行项目开发的过程中,经常会使用print语句打印一些调试信息,这些调试信息中往往会包含中文,如果你使用python版本是python2.7,或许你也会遇到和我 ...

  2. C# 使用printDocument1.Print打印时不显示 正在打印对话框

    C#使用printDocument1.Print打印时不显示正在打印对话框有两种方法 第一种,使用PrintController       PrintController printControll ...

  3. C# 使用printDocument1.Print打印时不显示 正在打印对话框(里面还有一个讨厌的取消按钮)

    C#使用printDocument1.Print打印时不显示正在打印对话框有两种方法 第一种,使用PrintController PrintController printController = n ...

  4. CSS控制print打印样式

    来源:http://blog.csdn.net/pangni/article/details/6224533 一.添加打印样式 1. 为屏幕显示和打印分别准备一个css文件,如下所示:   用于屏幕显 ...

  5. window.print()打印页面指定内容(使用iframe保证原页面不失效)

    使用window.print()时会出现两个问题: (1)直接使用window.print() 打印的是整页内容-->无法实现打印指定区域 (2)打印时替换body中的内容,打印完成后再替换回来 ...

  6. window.print打印方法实现

    vue中使用window.print打印效果 项目要求 打印每页有10行表格,如果接口数据没有十个显示10行 效果图 第一页 第二页 子组件 <template> <div> ...

  7. 技巧:Python中print打印信息的同时打印文件、行号

    import sys def Log(msg): print('Print Message: '+msg+' ,File: "'+__file__+'", Line '+str(s ...

  8. window.print()打印网页(一)

    有时候需要将网页内容打印到纸上,最简单的一种方法是用window对象的print方法. window.print()默认打印当前网页的所有部分.(除了背景,默认打印都是白底黑字,如果有特别的设置 要另 ...

  9. Python使用print打印时,展示内容不换行

    原理 Python的print()函数中参数end='' 默认为\n,所以会自动换行; 默认的print()函数: print(end='\n') 方案 Python 2: 在print语句的末尾加上 ...

随机推荐

  1. MyBatis的关于批量数据操作的测试

    摘录自:http://www.linuxidc.com/Linux/2012-05/60863.htm MyBatis的前身就是著名的Ibatis,不知何故脱离了Apache改名为MyBatis.My ...

  2. forward和redirect

    Forward和Redirect代表了两种请求转发方式:直接转发和间接转发. 直接转发方式(Forward),客户端和浏览器只发出一次请求,Servlet.HTML.JSP或其它信息资源,由第二个信息 ...

  3. php实现监控在线服务应用程序小栗子

    下面我就给大家举个栗子(例子) 某单位需要实现监控服务器状态,和监控服务器应用网站,还有需要监控服务器的中间件,数据库状态监控.听到这个任务是不是恨透头疼,这想起来是不是头疼.还好有系统可用,但是我现 ...

  4. 【处理多服务器日志合并处理问题】多服务器的日志合并统计——apache日志的cronolog轮循

    转发:http://www.chedong.com/tech/rotate_merge_log.html   内容摘要:你完全不必耐心地看完下面的所有内容,因为结论无非以下2点:1 用 cronolo ...

  5. centos下配置sftp且限制用户访问目录[转]

    第一步:创建sftp服务用户组,创建sftp服务根目录 groupadd sftp #此目录及上级目录的所有者(owner)必须为root,权限不高于755,此目录的组最好设定为sftp mkdir ...

  6. django url路由参数错误

    出现错误: TypeError get() got an unexpected keyword argument 'teacher_id 出错原因: view类中,get方法获得了一个多余的额参数,这 ...

  7. linkin大话设计模式--模板方法模式

    linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...

  8. linkin大话面向对象--闭包和回调

      先来理解2个概念:闭包和回调   什么是闭包? 闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建他的作用域.通过这个定义,可以看出内部类是面向对象的闭包,因为他不仅包含了外部类对象的信 ...

  9. 【Shell脚本学习指南笔记】重定向文件描述符 2>&1

    如: make > results 2>&1 重定向 > results让文件描述符1(标准输出)作为文件results,接下来的重定向2>&1有两个部分.2& ...

  10. MyCat 入门:漫谈 MyCat 配置系统

    文章首发于[博客园-陈树义],点击跳转到原文<MyCat 入门:漫谈 MyCat 配置系统> 上篇文章<MyCat 启蒙:分布式系统的数据库架构演变>中,我们通过一个项目从零到 ...