SQL中print、sp

60次阅读
没有评论

共计 2087 个字符,预计需要花费 6 分钟才能阅读完成。

本篇文章给大家分享的是有关 SQL 中 print、sp_helptext 的限制与扩展是怎样的,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。

在 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

code-1

还有一个存储 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

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 pubsEXEC sp_helptext  employee_insupd

以上就是 SQL 中 print、sp_helptext 的限制与扩展是怎样的,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-17发表,共计2087字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)