01. SELECT显示和PRINT打印超长的字符
从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打印超长的字符的更多相关文章
- 【原创】python中文编码问题深入分析(二):print打印中文异常及显示乱码问题分析与解决
在学习python以及在使用python进行项目开发的过程中,经常会使用print语句打印一些调试信息,这些调试信息中往往会包含中文,如果你使用python版本是python2.7,或许你也会遇到和我 ...
- C# 使用printDocument1.Print打印时不显示 正在打印对话框
C#使用printDocument1.Print打印时不显示正在打印对话框有两种方法 第一种,使用PrintController PrintController printControll ...
- C# 使用printDocument1.Print打印时不显示 正在打印对话框(里面还有一个讨厌的取消按钮)
C#使用printDocument1.Print打印时不显示正在打印对话框有两种方法 第一种,使用PrintController PrintController printController = n ...
- CSS控制print打印样式
来源:http://blog.csdn.net/pangni/article/details/6224533 一.添加打印样式 1. 为屏幕显示和打印分别准备一个css文件,如下所示: 用于屏幕显 ...
- window.print()打印页面指定内容(使用iframe保证原页面不失效)
使用window.print()时会出现两个问题: (1)直接使用window.print() 打印的是整页内容-->无法实现打印指定区域 (2)打印时替换body中的内容,打印完成后再替换回来 ...
- window.print打印方法实现
vue中使用window.print打印效果 项目要求 打印每页有10行表格,如果接口数据没有十个显示10行 效果图 第一页 第二页 子组件 <template> <div> ...
- 技巧:Python中print打印信息的同时打印文件、行号
import sys def Log(msg): print('Print Message: '+msg+' ,File: "'+__file__+'", Line '+str(s ...
- window.print()打印网页(一)
有时候需要将网页内容打印到纸上,最简单的一种方法是用window对象的print方法. window.print()默认打印当前网页的所有部分.(除了背景,默认打印都是白底黑字,如果有特别的设置 要另 ...
- Python使用print打印时,展示内容不换行
原理 Python的print()函数中参数end='' 默认为\n,所以会自动换行; 默认的print()函数: print(end='\n') 方案 Python 2: 在print语句的末尾加上 ...
随机推荐
- Python3基础知识
1.查看关键字 Python3查看关键字要先导入模块keyword,然后运用keyword的属性kwlist获取 >>> import keyword>>> key ...
- docker结合jenkins、gitlab实现.netcore的持续集成实践
本文的目标是实现下图基于ASP NET Core的实践 运行环境 Cent OS 7 vs code .net core cmder 运行docker,设置docker镜像加速器,不然国内下载imag ...
- JavaScript的三种类型检测typeof , instanceof , toString比较
1.typeof typeof是js的一个操作符,在类型检测中,几乎没有任何用处. typeof 返回一个表达式的数据类型的字符串,返回结果为javascript中的基本数据类型,包括:number. ...
- SpringMvc4.x--@ControllerAdvice注解
通过@ControllerAdvice.我们可以将对于控制器的全局配置放置在同一个位置,注解了@ControllerAdvice的类的方法可以使用@ExceptionHandler,@InitBind ...
- linux常用命令_1
linux中命令格式是什么? 命令 [参数选项] [文件或路径] 中括号表示可选,命令的参数与路径文件可选 参数选择表示一个命令的不同功能 命令 和 参数选项 中必有一空格,多个参数连在一起写 几乎所 ...
- python_如何设置文件缓冲类型
案例: 将文件内容写入到硬件设备时候,使用系统调用,这类IO操作时间长,为了减小IO操作,通常会使用缓冲区(有足够多数据才能调用). 文件缓冲行为分为:全缓冲,行缓冲,无缓冲 如何解决? open(' ...
- java常用类--正则表达式
正则表达式到底是什么? 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码. 很可能你使用过W ...
- iOS页面切换动画实现方式。
iOS页面切换动画实现方式. 1.使用UIView animateWithDuration:animations:completion方法 Java代码 [UIView animateWithDura ...
- Mysql Innodb 锁机制
latch与lock latch 可以认为是应用程序中的锁,可以称为闩锁(轻量级的锁) 因为其要求锁定的时间必须要非常短,若持续时间长,则会导致应用性能非常差,在InnoDB存储引擎中,latch又可 ...
- 快速用Markdown排版一篇文章
前言 如果想先看下效果可以参见鄙人使用Markdown的排版的一篇文章--Markdown编辑效果. 本文会将每个设置在文内做示例. 本文不介绍完整的Markdown用法. 本文只简洁的介绍,使用Ma ...