SQL中print、sp_helptext的限制与扩展
在sql中,使用动态sql是很常见的。有些复杂的计算Mssq分页存储过程,或是存储过程,代码很长,中间可能有多次执行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上操作等,看个人习惯或方便操作了。 详解sp_helptext 显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本。 语法 sp_helptext [ @objname = ] ‘name’ 参数 [@objname =] ‘name’ 对象的名称,将显示该对象的定义信息。对象必须在当前数据库中。name 的数据类型为 nvarchar(776),没有默认值。 返回代码值 0(成功)或 1(失败) 注释 sp_helptext 在多个行中显示用来创建对象的文本,其中每行有 transact-sql 定义的 255 个字符。这些定义只驻留在当前数据库的 syscomments 表的文本中。 权限 执行权限默认授予 public 角色。 示例 下面的示例显示 employee_insupd 触发器的文本,该触发器在数据库 pubs 中。 use pubs exec sp_helptext 'employee_insupd' 高明论坛: (编辑:徐州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |