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

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

IF OBJECT_ID(N'sp_print_all') IS NOT NULLBEGINDROP PROCEDURE sp_print_allENDGOCREATE PROCEDURE sp_print_all (@dynamic_sql NVARCHAR(MAX))ASDECLARE @start INTDECLARE @len INTSET @start = 1SET @len = 4000WHILE (@start < LEN(@dynamic_sql))BEGINPRINT SUBSTRING(@dynamic_sql, @start, @len)SET @start = @start + @lenENDPRINT SUBSTRING(@dynamic_sql, @start, @len)GO 

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

IF OBJECT_ID(N'sp_helptext_user') IS NOT NULLBEGINDROP PROCEDURE sp_helptext_userENDGOCREATE PROCEDURE sp_helptext_user(@obj_name NVARCHAR(200) = '')ASSET NOCOUNT ON;DECLARE @text NVARCHAR(MAX),@i INT,@text2 NVARCHAR(MAX),@db_name SYSNAME,@obj_id BIGINTSET @db_name = PARSENAME(@obj_name ,3)IF @db_name IS NULLSET @db_name = DB_NAME()ELSE IF @db_name <> DB_NAME()BEGINRAISERROR(15250 ,-1 ,-1)RETURN (1)ENDSET @obj_id = OBJECT_ID(@obj_name)IF @obj_id IS NULLBEGINRAISERROR(15009 ,-1 ,-1 ,@obj_name ,@db_name)RETURN (1)ENDSELECT @text = [definition]FROM sys.all_sql_modulesWHERE [object_id] = @obj_idWHILE LEN(@text) > 2000BEGINSET @i = CHARINDEX(CHAR(13) ,@text ,2000) SET @text2 = LEFT(@text ,@i)SET @text = SUBSTRING(@text ,@i + 2 ,LEN(@text)) PRINT @text2ENDPRINT @textSET NOCOUNT OFF;GO 

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

详解sp_helptext

显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本。

语法

sp_helptext [ @objname = ] 'name'

参数

[@objname =] 'name'

对象的名称,将显示该对象的定义信息。对象必须在当前数据库中。name 的数据类型为 nvarchar(776),没有默认值。

返回代码值

0(成功)或 1(失败)

注释

sp_helptext 在多个行中显示用来创建对象的文本,其中每行有 Transact-SQL 定义的 255 个字符。这些定义只驻留在当前数据库的 syscomments 表的文本中。

权限

执行权限默认授予 public 角色。

示例

下面的示例显示 employee_insupd 触发器的文本,该触发器在数据库 pubs 中。

USE pubsEXEC sp_helptext 'employee_insupd'

更多相关文章

  1. SQL Server之JSON 函数详解
  2. MySQL 5.7.9 服务无法启动-“NET HELPMSG 3534”的解决方法
  3. MySQL系列多表连接查询92及99语法示例详解教程
  4. Linux下MYSQL 5.7 找回root密码的问题(亲测可用)
  5. MySQL 什么时候使用INNER JOIN 或 LEFT JOIN
  6. Android(安卓)-- Android(安卓)JUint 与 Sqlite
  7. android中SqLite query中用selectionArgs处理字符传值
  8. android从服务器下载文件(php+apache+win7+MySql)
  9. Android(安卓)ORM SQL Top 5

随机推荐

  1. android junit (一)
  2. 自定义控件之View原理与使用
  3. android基础知识12:android自动化测试06—
  4. Android FrameLayout子view居中(左居中,右
  5. Android定义圆角背景方面的介绍
  6. 【Android】应用程序启动过程源码分析
  7. 【译】Google官方推出的Android架构组件
  8. Linux kernel起来后Android启动过程
  9. Android的Activity屏幕切换动画-左右滑动
  10. android位图颜色模式的问题