zoukankan      html  css  js  c++  java
  • 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上操作等,看个人习惯或方便操作了。

  • 相关阅读:
    撕衣服的简易实现
    简易的画画板的实现
    图片简易处理
    在内存中创建原图的副本
    缩放图片并加载到内存中
    加载大图片的OOM异常
    计算机表示图形的形式
    虚拟短信
    ContentProvider 共享数据
    内容观察者
  • 原文地址:https://www.cnblogs.com/fishparadise/p/4797539.html
Copyright © 2011-2022 走看看