zoukankan      html  css  js  c++  java
  • sp_helptext输出错行问题解决

      相信,大家对sp_helptext存储过程一定不陌生,它可以帮你快速获取存储过程等对象的定义。但它有一个致命的缺点就是:每行最多返回255个nvarchar类型的字符,假如有一个编写不规范的存储过程,它的某些行超出了255,则取出的定义内容,很可能出错。其实,对象的定义都已经完整地存储在它所在数据库的sys.sql_modules视图中(兼容性视图为:sys.syscomments),下面介绍一个小方法来解决这个问题:
    USE tempdb
    GO
    
    --创建测试存储过程
    CREATE PROC dbo. Demo1
           @Length INT
    AS
    SET NOCOUNT ON
    IF(@Length > 0 )
           PRINT '>0'
    ELSE
           PRINT '<=0'
    
    GO
    
    --获取存储过程定义
    DECLARE @ObjectName NVARCHAR( 50)
    SET @ObjectName = N'Demo1'
    
    SELECT ObjectDefinition =b. name FROM
    (SELECT Content=CONVERT (XML, '<root><v><![CDATA[' + REPLACE(OBJECT_DEFINITION (OBJECT_ID( @ObjectName)), CHAR(13 )+CHAR( 10), ']]></v><v><![CDATA[' ) + ']]></v></root>')) a
    OUTER APPLY
    (SELECT [name] = C. v.value ('.', 'NVARCHAR(MAX)') FROM a.Content .nodes( '/root/v') C(v )) b
    
    --直接拷贝结果
    /*
    
    --创建测试存储过程
    CREATE PROC dbo.Demo1
          @Length INT
    AS
    SET NOCOUNT ON
    IF(@Length > 0)
          PRINT '>0'
    ELSE
          PRINT '<=0'
    
    */
         
      小结
      #1. 突破了每行255个字符的限制。每行字符长度无限制,输出总内容长度无限制。
      #2. 可以直接从表格结果集中粘贴出结果,而不用再切换到文本显示选项(Ctrl+T)或用PRINT函数打印到输出窗口(PRINT函数输出的最大长度为8000)
      #3. 果断定义成快捷键,放到SQL Prompt的Snippet Manager中
      #4. 看了下sp_helptext的定义了解到:#1.系统对象的object_id为负整数,用户对象的object_id为正整数 #2.syscomments视图text列类型为nvarchar(4000),也就是说,假设一个存储过程的内容长度为4001个字符,那么它将分2行存储在syscomments中 #3.sp_helptext输出结果以换行+回车(char(13)+char(10))为拆分输出行,如果输出行的长度大于255,则按每行最大255个字符再次拆分。

  • 相关阅读:
    一元多项式的运算
    单链表逆转
    字符串函数
    历届试题 错误票据
    不用循环,不用递归,输出1~1000的整数
    sql三维数据
    SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问 (也就是跨数据库访问出错)
    由于服务器意外的断电,导致SQL SERVER服务器上数据库出现“置疑”而无法使用,
    关于delphi7的四舍五入
    关于delphi exit 继承
  • 原文地址:https://www.cnblogs.com/wwwwgou/p/3551786.html
Copyright © 2011-2022 走看看