TSQL--如何突破PRINT的8000大限

相信很多DBA都喜欢干的一件事就是拼SQL语句,我也不例外,但是PRINT只能打印4000的Unicode string或8000的Non-unicode string, 这个蛋疼的限制会导致过长的string被截断,为此不得不改写很多SQL,造成诸多不便!

 

说多就是眼泪!!!

 

今晚长夜漫漫,溜达论坛时看到林勇桦的《SQLSERVER  PRINT语句的换行》,再次思考如果突破此大限制,突然灵机一动,一个惊天地泣鬼神的大招<XML无上限>被顿悟出来!

 

假设有以下场景:

DECLARE @SQL NVARCHAR(MAX)
SET @SQL=''
SELECT @SQL=@SQL+'
'+name FROM sys.all_columns
PRINT @SQL
SELECT @SQL


我们会发现PRINT 被截断,而SELECT 出来的语句又不换行,此时换换小清醒口味吧

DECLARE @SQL NVARCHAR(MAX)
SET @SQL=''
SELECT @SQL=@SQL+'
'+name FROM sys.all_columns
PRINT @SQL
SELECT @SQL FOR XML PATH('')

执行截图:

黎明前总是最黑暗的,看到这个形同乱码的XML不要激动,勇敢滴重击一下

这是不是你梦寐以求的东东啦!

在SSMS中"工具">>"选项"下,可以设置XML的大小

 

 

--==================================================================

-- SQL Server DMVs In Action中使以下方式来实现 

复制代码
DECLARE @SQL NVARCHAR(MAX)
SELECT  @SQL =REPLICATE(CAST('1' AS NVARCHAR(MAX)),8000)+'23'
DECLARE @StartOffset INT
DECLARE @Length INT
SET @StartOffset=0
SET @Length=4000

WHILE(@StartOffset<LEN(@SQL))
BEGIN
    PRINT SUBSTRING(@SQL,@StartOffset,@Length)
    SET @StartOffset=@StartOffset+@Length
END
PRINT SUBSTRING(@SQL,@StartOffset,@Length)
复制代码

 

 

--==================================================================

骚年,不用再为马赛克烦恼啦,心中无码,天下无码!

盗个妹子来养眼,感谢神吧!

 

 

 

 

posted on   笑东风  阅读(3425)  评论(7编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现

导航

点击右上角即可分享
微信分享提示