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上操作等,看个人习惯或方便操作了。

时间: 2024-10-29 16:52:23

print、sp_helptext的限制与扩展的相关文章

用Python遍历(Linux)的子目录并且查找出指定的字符串带(扩展名)黑白名单功能

<软件&网站架构师手记>之一_用Python脚本补充Linux命令的不完善之二: 用Python脚本遍历(Linux)的子目录(或文件夹)并且查找出指定的字符串,并且显示: 1.目录位置: 2.(字符串)所在的文件名: 3.字符串所在(文件中)的行号; 4.以及显示本行信息,既显示本行的(从本行开始)的256个字符. #并且支持把扩展名放进脚本中 用数组存放的黑.白(扩展名)名单中: 既先在"白扩展名"类型的文件当中:检索,如*.txt, *.log, *.cnf,

Scrapy框架的八个扩展

一.proxies代理 首先需要在环境变量中设置 from scrapy.contrib.downloadermiddleware.httpproxy import HttpProxyMiddleware 方式一:使用默认 os.environ { http_proxy:http://root:[email protected]:9999/ https_proxy:http://192.168.11.11:9999/ } 缺点:原生代理是把代理放在python环境变量里面,也就是要依赖于pyth

scrapy的扩展件extensions

extensions.py文件 # -*- coding: utf-8 -*- # 该扩展会在以下事件时记录一条日志: # spider被打开 # spider被关闭 # 爬取了特定数量的条目(items) import logging from collections import defaultdict from scrapy import signals from scrapy.exceptions import NotConfigured from datetime import dat

ubuntu下python脚本调用有道词典API实现命令行查词

#!/usr/bin/env python #coding=utf-8 '''   python使用有道词典的API来实现命令行查词 ''' import urllib2 import json import sys  reload(sys) sys.setdefaultencoding('utf-8') key = '1096888977' keyfrom = 'bloketest' doctype = 'json' u = 'http://fanyi.youdao.com/openapi.d

继承和类设计

========================== ========================== oc是一门面向对象的语言,面向对象编程有三大特性:封装.继承.多态 一.封装 [注]封装就是把某些解决一些问题的代码进行模块化,对外部暴露一个接口.我们都称为封装了一个方法: [优点] 1.封装可以增强代码的复用度. 2.封装可以有效提高开发速度. 二.继承 子类拥有了父类的方法和属性的情况,我们称为继承: A:B(读作:A类继承B类,也就A类拥有了B类的方法和属性) [优点] 1.不用书

python之路3:

1 class set(object): 2 """ 3 set() -> new empty set object 4 set(iterable) -> new set object 5 6 Build an unordered collection of unique elements. 7 """ 8 wjh=set(['1','2','3']) 9 wjh.add('4') 10 wjh.add('4') 11 print(w

爬虫:Scrapy5 - 选择器Selectors

当抓取网页时,常见的任务是从HTML源码中提取数据.现有的一些库可以达到这个目的: BeautifulSoup lxml Scrapy 提取数据有自己的一套机制.它们被称作选择器(seletors),因为他们通过特定的 XPath 或者 CSS 表达式来"选择" HTML 文件中的某个部分. 构造选择器 Scrapy selector 是以 文字(Text)或 TextResponse 构造的 Selector.其根据输入类型自动选择最优的分析方法(XML vs HTML): >

python之路第二篇

python语言介绍 编译型和解释型 静态语言和动态语言 强类型定义语言和弱类型语言 python数据类型介绍 python数据类型分:数字.布尔型.字符串.列表.元组.字典 1.整数 例如:1,2,33,44等 整数的功能如下: 1 class int(object): 2 """ 3 int(x=0) -> int or long 4 int(x, base=10) -> int or long 5 6 Convert a number or string t

python3-day3(函数-参数)

1.参数 函数的核心是参数传值,其次是返回值,熟练这两这个技术即可灵活使用函数. 1>普通参数 def  show(name): print(name) show('tom') 2>默认参数 def show(name,age=18) print("%s,%s"%(name,age)) show('tom',19) show('tom') 3>动态参数-序列 def show(*args): print(args) show(11,22,33) li=[11,22,3