在SQL中,使用动态SQL是很常见的。有些复杂的计算,或是存储过程,代码很长,中间可能有多次执行SQL语句。而调试拼串的SQL语句却是件痛苦的事,很难看出来运行的语句是什么。所以我会经常使用print这个命令把运行前的语句打印到屏幕上,然后复制出来到另一个窗口进行调试、修改,这样就比较方便了。但是这个print命令有一些限制,在单字节符集下,最大只能打印打印8000个字符的长度,而在双字节字符集是4000个。

以下存储过程可以打印完整的信息,不受长度的限制。代码如下:

IF OBJECT_ID(N'sp_print_all') IS NOT NULL
BEGIN
DROP PROCEDURE sp_print_all
END
GO
CREATE PROCEDURE sp_print_all (@dynamic_sql NVARCHAR(MAX))
AS DECLARE @start INT
DECLARE @len INT
SET @start = 1
SET @len = 4000 WHILE (@start < LEN(@dynamic_sql))
BEGIN
PRINT SUBSTRING(@dynamic_sql, @start, @len)
SET @start = @start + @len
END
PRINT SUBSTRING(@dynamic_sql, @start, @len)
GO

code-1

还有一个存储sp_helptext,可以查询存储过程,函数等代码,使用起来也比较方便,但也有长度的限制,而且打印出来的格式跟源代码的格式有些对应不上。写了一个自定义存储过程来代替,代码如下:

IF OBJECT_ID(N'sp_helptext_user') IS NOT NULL
BEGIN
DROP PROCEDURE sp_helptext_user
END
GO
CREATE PROCEDURE sp_helptext_user(@obj_name NVARCHAR(200) = '')
AS
SET NOCOUNT ON;
DECLARE @text NVARCHAR(MAX)
,@i INT
,@text2 NVARCHAR(MAX)
,@db_name SYSNAME
,@obj_id BIGINT SET @db_name = PARSENAME(@obj_name ,3)
IF @db_name IS NULL
SET @db_name = DB_NAME()
ELSE
IF @db_name <> DB_NAME()
BEGIN
RAISERROR(15250 ,-1 ,-1)
RETURN (1)
END SET @obj_id = OBJECT_ID(@obj_name)
IF @obj_id IS NULL
BEGIN
RAISERROR(15009 ,-1 ,-1 ,@obj_name ,@db_name)
RETURN (1)
END SELECT @text = [definition]
FROM sys.all_sql_modules
WHERE [object_id] = @obj_id WHILE LEN(@text) > 2000
BEGIN
SET @i = CHARINDEX(CHAR(13) ,@text ,2000)
SET @text2 = LEFT(@text ,@i)
SET @text = SUBSTRING(@text ,@i + 2 ,LEN(@text))
PRINT @text2
END
PRINT @text
SET NOCOUNT OFF;
GO

code-2

当然,查看源代码有多种方法,可以在SSMS上操作等,看个人习惯或方便操作了。

print、sp_helptext的限制与扩展的更多相关文章

  1. 重构sql server的sys.sp_helptext存储

    本文目录列表: 1.sys.sp_helptext存储的功能和效果 2.重构sys.sp_helptext存储(命名为dbo.usp_helptext)提供直观的效果 3.sys.sp_helptex ...

  2. 爬虫之scrapy扩展

    针对pipelines的扩展 from scrapy.exceptions import DropItem class CustomPipeline(object): def __init__(sel ...

  3. swift 学习- 23 -- 扩展

    // 扩展 就是为一个已有的 类, 结构体, 枚举, 或者 协议类型添加新功能, 这包括在没有权限获取 原始代码的情况下 扩展类型的能力 (即 逆向建模), 扩展和 OC 中的分类类似, (与 OC ...

  4. [Swift通天遁地]五、高级扩展-(11)图像加载Loading动画效果的自定义和缓存

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. scrapy的扩展件extensions

    extensions.py文件 # -*- coding: utf-8 -*- # 该扩展会在以下事件时记录一条日志: # spider被打开 # spider被关闭 # 爬取了特定数量的条目(ite ...

  6. Flutter——Dart Extension扩展方法的使用

    dart的extension方法可以给已经存在的类添加新的函数,通过extension我们可以封装一些常用方法,提高开发效率. 例一:扩展String 给string添加一个log打印方法 exten ...

  7. Java 8 的 Nashorn 脚本引擎教程

    本文为了解所有关于 Nashorn JavaScript 引擎易于理解的代码例子. Nashorn JavaScript 引擎是Java SE 8的一部分,它与其它像Google V8 (它是Goog ...

  8. Python【第二章】:Python的数据类型

    基本数据类型 一.整型 如: 18.73.84 二.长整型 如:2147483649.9223372036854775807 三.浮点型 如:3.14.2.88 四.字符串 如:'wupeiqi'.' ...

  9. Python学习【第四篇】用户输入及判断

    用户输入: 例1.写一个用户输入密码的小程序,流程如下: 1.用户输入自己的用户名 2.打印"Hello+用户名" #!/usr/bin/env python #name = ra ...

随机推荐

  1. stm32 hid 键盘描述

    /* USB Standard Device Descriptor */ const uint8_t Joystick_DeviceDescriptor[JOYSTICK_SIZ_DEVICE_DES ...

  2. shell中export理解误区

    一直以来,以为shell脚本中经过export后的变量会影响到执行这个shell的终端中的环境变量.环境变量这个概念不是shell所独有的,而是linux里面进程所拥有的,shell解释器运行起来就是 ...

  3. ANSYS17.0详细安装图文教程

    ANSYS 17.0是ANSYS的最新版.下面以图文方式详细描述该软件的安装过程. 1 安装前的准备 安装之前需要做的准备工作: 在硬盘上腾出30G的空间来.(视安装模块的多少,完全安装可能需要二十多 ...

  4. BI报表系统在银行业的应用

    在当前大数据的背景下,银行业传统联机业务技术存在开发周期长.不够灵活.大量的业务数据难以充分利用.操作复杂.监控效率低等弊端,多数企业表示需要搭建一个符合银行特色的商业智能平台,把需要的数据和信息集中 ...

  5. hdu 5652 India and China Origins 并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题目大意:n*m的矩阵上,0为平原,1为山.q个询问,第i个询问给定坐标xi,yi,表示i年后这 ...

  6. 用U盘安装Ubuntu系统

    用U盘安装Ubuntu,需制作一个Ubuntu的U盘安装盘,最为方便和可靠的制作方法是在Linux系统下使用dd命令,具体如下, sudo dd if=ubuntu-14.04.4-server-am ...

  7. java线程池(newSingleThreadExecutor())小应用

    创建单个线程,用来操作一个无界的队列任务,不会使用额外的线程.如果线程崩溃会重新创建一个,直到任务完成. 代码: import java.util.concurrent.ExecutorService ...

  8. [No000068]document.body.clientHeight 和 document.documentElement.clientHeight 的区别

    document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.docume ...

  9. iOS重一些常用的代理模式

    (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现.优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和proto ...

  10. webapi相关知识

    1.从uri中获取参数 :后端:[FromUri] 2.从uri中获取数组参数:后端:[FromUri]string[] type  前端:type[]=1&type[]=2&type ...