SQL中print、sp_helptext的限制与扩展是怎样的
本篇文章给大家分享的是有关SQL中print、sp_helptext的限制与扩展是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
在SQL中,使用动态SQL是很常见的。有些复杂的计算,或是存储过程,代码很长,中间可能有多次执行SQL语句。而调试拼串的SQL语句却是件痛苦的事,很难看出来运行的语句是什么。所以我会经常使用print这个命令把运行前的语句打印到屏幕上,然后复制出来到另一个窗口进行调试、修改,这样就比较方便了。但是这个print命令有一些限制,在单字节符集下,最大只能打印打印8000个字符的长度,而在双字节字符集是4000个。
以下存储过程可以打印完整的信息,不受长度的限制。代码如下:
IFOBJECT_ID(N'sp_print_all')ISNOTNULLBEGINDROPPROCEDUREsp_print_allENDGOCREATEPROCEDUREsp_print_all(@dynamic_sqlNVARCHAR(MAX))ASDECLARE@startINTDECLARE@lenINTSET@start=1SET@len=4000WHILE(@start<LEN(@dynamic_sql))BEGINPRINTSUBSTRING(@dynamic_sql,@start,@len)SET@start=@start+@lenENDPRINTSUBSTRING(@dynamic_sql,@start,@len)GO
code-1
还有一个存储sp_helptext,可以查询存储过程,函数等代码,使用起来也比较方便,但也有长度的限制,而且打印出来的格式跟源代码的格式有些对应不上。写了一个自定义存储过程来代替,代码如下:
IFOBJECT_ID(N'sp_helptext_user')ISNOTNULLBEGINDROPPROCEDUREsp_helptext_userENDGOCREATEPROCEDUREsp_helptext_user(@obj_nameNVARCHAR(200)='')ASSETNOCOUNTON;DECLARE@textNVARCHAR(MAX),@iINT,@text2NVARCHAR(MAX),@db_nameSYSNAME,@obj_idBIGINTSET@db_name=PARSENAME(@obj_name,3)IF@db_nameISNULLSET@db_name=DB_NAME()ELSEIF@db_name<>DB_NAME()BEGINRAISERROR(15250,-1,-1)RETURN(1)ENDSET@obj_id=OBJECT_ID(@obj_name)IF@obj_idISNULLBEGINRAISERROR(15009,-1,-1,@obj_name,@db_name)RETURN(1)ENDSELECT@text=[definition]FROMsys.all_sql_modulesWHERE[object_id]=@obj_idWHILELEN(@text)>2000BEGINSET@i=CHARINDEX(CHAR(13),@text,2000)SET@text2=LEFT(@text,@i)SET@text=SUBSTRING(@text,@i+2,LEN(@text))PRINT@text2ENDPRINT@textSETNOCOUNTOFF;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 中。
USEpubsEXECsp_helptext'employee_insupd'
以上就是SQL中print、sp_helptext的限制与扩展是怎样的,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。