SQL中print、sp_helptext的限制与扩展

 更新时间:2016年02月02日 11:23:12   作者:FishParadise  
这篇文章主要介绍了print、sp_helptext的限制与扩展 的相关资料,需要的朋友可以参考下

在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'

相关文章

  • 使用SQL语句将相同名的多行字段内容拼接(方法详解)

    使用SQL语句将相同名的多行字段内容拼接(方法详解)

    这篇文章主要介绍了使用SQL语句将相同名的多行字段内容拼接起来,可以使用GROUP_CONCAT函数来实现相同名称的多行字段内容拼接,本文给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • T-SQL中使用正则表达式函数

    T-SQL中使用正则表达式函数

    有想过在T-Sql使用正则表达式吗?是的,完全可以的,我们可以用SQL SERVER CLR sql function来实现这一功能。
    2010-06-06
  • 拯救你的数据 通过日志恢复MSSQL数据

    拯救你的数据 通过日志恢复MSSQL数据

    这篇文章主要为大家详细介绍了如何通过日志恢复MSSQL数据的具体步骤,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 盘点SqlServer 分页方式和拉姆达表达式分页

    盘点SqlServer 分页方式和拉姆达表达式分页

    这篇文章主要介绍了SqlServer 5种分页方式和拉姆达表达式分页,进来看看吧,本文结合示例代码给大家讲解的非常详细,需要的朋友可以参考下
    2022-12-12
  • SQL Server学习笔记之事务、锁定、阻塞、死锁用法详解

    SQL Server学习笔记之事务、锁定、阻塞、死锁用法详解

    这篇文章主要介绍了SQL Server学习笔记之事务、锁定、阻塞、死锁用法,结合实例形式分析了SQL Server中事务、锁定、阻塞、死锁的概念、功能及相关使用技巧,需要的朋友可以参考下
    2017-07-07
  • MSSQL 监控数据/日志文件增长实现方法

    MSSQL 监控数据/日志文件增长实现方法

    今天就想实现这么一个功能,每天(频率可以调整)去收集一下数据文件的信息,放到一个表里面,这样方便我们分析数据文件的增长演变例程,甚至你可以将数据文件的增长幅度和业务变化关联起来分析
    2013-08-08
  • 掌握SQL Server实战教程之SQL Server的安装指南

    掌握SQL Server实战教程之SQL Server的安装指南

    对于项目来说最重要的一环莫过于数据库了,一个良好的数据库能够让项目更加清晰、条理分明,下面这篇文章主要给大家介绍了关于掌握SQL Server实战教程之SQL Server的安装指南,需要的朋友可以参考下
    2023-04-04
  • 一文讲懂SQL执行顺序

    一文讲懂SQL执行顺序

    开发人员需要应用SQL语句来构建数据库模型,测试人员需要用SQL语句来操作数据库数据,到底SQL语句的查询执行顺序是怎样的呢,本文就来介绍一下
    2023-09-09
  • SQL SERVER 开启CDC 实操详细

    SQL SERVER 开启CDC 实操详细

    这篇文章主要个代价介绍SQL SERVER CDC开启实操详细内容,文明芝麻官内容有详细代码及解说,需要的小伙伴可以参考一下
    2021-10-10
  • SQL Server中使用sp_password重置SA密码实例

    SQL Server中使用sp_password重置SA密码实例

    这篇文章主要介绍了SQL Server中使用sp_password重置SA密码实例,一般在忘记SA密码时的恢复手段,需要的朋友可以参考下
    2014-08-08

最新评论