在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上操作等,看个人习惯或方便操作了。
详解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'
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 尹毓恪.2018-浴室与太平洋【海蝶】【FLAC分轨】
- 《遗迹2:黑暗的视界》发布全新职业护卫者预告片,将于9月25日上线
- 好评如潮《彼方的她》迎来首次大型更新
- 《最终幻想16》PC版震撼登场 官方发布精彩宣传片
- 《中国十大国语老歌.男人篇 3CD》[WAV/分轨][1.5GB]
- 《汽车音响极品流行热曲发烧大碟 情伤 男声篇2CD》[WAV/分轨][980MB]
- 《绝版经典情歌 国语老歌 内地珍藏篇 2CD》[WAV/分轨][1.2GB]
- 崩坏星穹铁道冬城史学家成就获得攻略
- 金铲铲之战符文大陆城邦效果分享 有哪些效果
- 仙境传说新启航单手斧流派技能流铁匠玩法介绍
- 归龙潮笼鸟意未平任务怎么完成 笼鸟意未平任务流程攻略
- 归龙潮长命锁指引任务怎么过 长命锁的指引前进任务攻略
- 归龙潮破败小屋密码是什么 尘封的记忆支线攻略
- 瑞鸣音乐《中国音乐地图之听见西藏HQCD》[WAV]
- 老虎鱼DavidMunyon-PrettyBlue-24bit44.1kHz[FLAC]