zoukankan      html  css  js  c++  java
  • 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)

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

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

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

  • 相关阅读:
    dapperHelper
    .NET Core Session的使用方法
    Wpf 关闭当前窗体 打开新窗体
    C#中Split分隔字符串的应用(C#、split、分隔、字符串)
    wpf日期控件
    SQLite数据库数据类型详解
    Asp.Net Core 2.2
    手写图片懒加载
    css动画常用属性总结
    css购物车(抛物线)运动
  • 原文地址:https://www.cnblogs.com/TeyGao/p/3527587.html
Copyright © 2011-2022 走看看