金沙棋牌app手机下载

当前位置:金沙棋牌 > 金沙棋牌app手机下载 > server查询可编程对象定义的方式对比以及整合

server查询可编程对象定义的方式对比以及整合

来源:http://www.logblo.com 作者:金沙棋牌 时间:2019-11-05 18:52

正文目录列表:

本文目录列表:

1、sql server查看可编制程序对象定义的主意相比较

1、sys.sp_helptext存款和储蓄的意义和机能

2、整合实现全部可编制程序对象定义的查看功能的仓库储存dbo.usp_helptext2

2、重构sys.sp_helptext存储(命名为dbo.usp_helptext)提供直观的职能

3、dbo.helptext2的接纳性测量检验

3、sys.sp_helptext和dbo.usp_helptext的界定甚至施工方案

4、总结语

4、总结语

5、参谋清单列表

5、参谋清单列表

 

 

1、sql server查看可编制程序对象定义的法子相比

1、sys.sp_helptext存款和储蓄的成效和职能

 

 

上意气风发篇博文重构sql server的sys.helptext存储中写了sys.helptext的界定和出口格式每行自带char(13)和char(10)这多个字符。为了将可编制程序对象定义查询格局商讨深透,以下表格列出了查询可编制程序对象定义的比不上如法的却别和对可编制程序对象定义查看的支撑程度。

前段时间在钻探sql server提供的切实可行可编制程序对象定义体的艺术包蕴:sys.syscomments(视图)、sys.all_sql_modules(sys.sql_modules)(视图)、object_definition(函数)和sys.sp_helptext(存款和储蓄)。针对以上办法的比不上未来临时光在写成博文。本文首要商讨了sys.sp_helptext的显得效果,认为稍微不太美好。先看该存款和储蓄的现时效益如下图:

对象类型描述 对象类型简写
sys.sp_helptext
sys.sql_modules
sys.system_sql_modules
sys.all_sql_modules
object_definition
CHECK_CONSTRAINT
C
支持 不支持
不支持
不支持
支持
DEFAULT_CONSTRAINT(contraint,stand-alone)
D
支持 支持
不支持
支持
支持
SQL_SCALAR_FUNCTION
FN
支持
支持
支持
支持
支持
SQL_INLINE_TABLE_VALUED_FUNCTION
IF
支持
支持
支持
支持
支持
SQL_STORED_PROCEDURE
P
支持
支持 支持
支持
支持
RULE(old-style,stand-alone)
R
支持
支持
不支持
支持
支持
REPLICATION FILTER PROCEDURE
RF
支持
支持
支持
支持
支持
SQL_TABLE_VALUED_FUNCTION
TF
支持
支持
支持
支持
支持
SQL_TRIGGER
TR
支持(除数据库DDL触发器和服务器触发器外)
支持(除服务器触发器外)
不支持
支持(除服务器触发器外)
支持(除服务器触发器外)
USER_TABLE
U
computed_column
支持
不支持
不支持
不支持
不支持
VIEW
V
支持
支持
支持
支持
支持

金沙棋牌app手机下载 1

注意:

金沙棋牌app手机下载 2

1、带有_modules的是系统提供的目录视图类。

上海教室现在看未有啥样的,那就将如下图的Text字段列内容复制放入单独的文本中再看其功效如下图:

金沙棋牌app手机下载,2、sys.sql_modules包含富有客商定义的可编制程序对象的,当然也不支持计算列和服务器触发器的。

金沙棋牌app手机下载 3

3、sys.system_sql_modules不扶持系统定义的等级次序为C、D、宝马X5、TEvoque的对象。

金沙棋牌app手机下载 4

4、sys.all_sql_modules就是sys.sql_modules和sys.system_sql_modules这些视图的并会集果的,当然也不辅助系统定义的门类为C、D、XC90、T揽胜类型的靶子。

上海教室小编中黄矩形框标明之处了呢,每种行后都增加了char(13)和char(10)这八个字符导致的那样的突显效果,假使根据这一个结果为功底举行改造,就大增了可编制程序对象定义的长短(首假设char(13)和char(10))。

5、sys.sp_helptext固然帮忙上述表格中除数据库DDL触发器和服务器触发器之外的可编制程序对象,但是其出口格式有限制:1、每行最多225双字节字符号,那样有希望招致输出将多个标志符分割为前后两行的。

 

6、object_definition函数协助上述表格中除服务器除触发器和估测计算列外的能够成为对象。

2、重构sys.sp_helptext存储(命名为dbo.usp_helptext)提供直观的效果与利益

7、sys.sp_helpttext和object_definition有个作用的范围:1、在SSMS客商端中生机勃勃经接纳字符串类型变量采纳再次回到的而结果,有望受制于SSMS顾客端针对字符串变量的最大规模(sql server 二零一一中的最大面积是43679双字节字符长度卡塔 尔(阿拉伯语:قطر‎不能够一切出口到客户端,那些毛病能够从通进程序编码完成得到完美展现。

 

 

发现了sys.sp_helptext的显示效果,笔者要钟情觉到不太知足,那么就重构嘛。重构后的代码如下:

2、整合完毕全部可编制程序对象定义的查看功效的仓库储存dbo.usp_helptext2

 

 

if object_id(N'dbo.usp_helptext', 'P') IS NOT NULL
begin
    drop procedure [dbo].[usp_helptext];
end
go

create procedure [dbo].[usp_helptext]
(
     @objname nvarchar(776)
    ,@columnname sysname = NULL
    ,@keeporiginal bit = NULL
)
as
begin
    set nocount on

    set @keeporiginal = ISNULL(@keeporiginal, 1);    

    declare @dbname sysname
    ,@objid    int
    ,@BlankSpaceAdded   int
    ,@BasePos       int
    ,@CurrentPos    int
    ,@TextLength    int
    ,@LineId        int
    ,@AddOnLen      int
    ,@LFCR          int --lengths of line feed carriage return
    ,@DefinedLength int

    /* NOTE: Length of @SyscomText is 4000 to replace the length of
    ** text column in syscomments.
    ** lengths on @Line, #CommentText Text column and
    ** value for @DefinedLength are all 255. These need to all have
    ** the same values. 255 was selected in order for the max length
    ** display using down level clients
    */
    ,@SyscomText    nvarchar(4000)
    ,@Line          nvarchar(255)

    select @DefinedLength = 255
    select @BlankSpaceAdded = 0 /*Keeps track of blank spaces at end of lines. Note Len function ignores
                                    trailing blank spaces*/
    CREATE TABLE #CommentText
    (LineId    int
        ,Text  nvarchar(255) collate catalog_default)

    /*
    **  Make sure the @objname is local to the current database.
    */
    select @dbname = parsename(@objname,3)
    if @dbname is null
        select @dbname = db_name()
    else if @dbname <> db_name()
            begin
                    raiserror(15250,-1,-1)
                    return (1)
            end

    /*
    **  See if @objname exists.
    */
    select @objid = object_id(@objname)
    if (@objid is null)
            begin
            raiserror(15009,-1,-1,@objname,@dbname)
            return (1)
            end

    -- If second parameter was given.
    if ( @columnname is not null)
        begin
            -- Check if it is a table
            if (select count(*) from sys.objects where object_id = @objid and type in ('S ','U ','TF'))=0
                begin
                    raiserror(15218,-1,-1,@objname)
                    return(1)
                end
            -- check if it is a correct column name
            if ((select 'count'=count(*) from sys.columns where name = @columnname and object_id = @objid) =0)
                begin
                    raiserror(15645,-1,-1,@columnname)
                    return(1)
                end
        if (ColumnProperty(@objid, @columnname, 'IsComputed') = 0)
            begin
                raiserror(15646,-1,-1,@columnname)
                return(1)
            end

            declare ms_crs_syscom  CURSOR LOCAL
            FOR select text from syscomments where id = @objid and encrypted = 0 and number =
                            (select column_id from sys.columns where name = @columnname and object_id = @objid)
                            order by number,colid
            FOR READ ONLY

        end
    else if @objid < 0    -- Handle system-objects
        begin
            -- Check count of rows with text data
            if (select count(*) from master.sys.syscomments where id = @objid and text is not null) = 0
                begin
                    raiserror(15197,-1,-1,@objname)
                    return (1)
                end

            declare ms_crs_syscom CURSOR LOCAL FOR select text from master.sys.syscomments where id = @objid
                ORDER BY number, colid FOR READ ONLY
        end
    else
        begin
            /*
            **  Find out how many lines of text are coming back,
            **  and return if there are none.
            */
            if (select count(*) from syscomments c, sysobjects o where o.xtype not in ('S', 'U')
                and o.id = c.id and o.id = @objid) = 0
                    begin
                            raiserror(15197,-1,-1,@objname)
                            return (1)
                    end

            if (select count(*) from syscomments where id = @objid and encrypted = 0) = 0
                    begin
                            raiserror(15471,-1,-1,@objname)
                            return (0)
                    end

            declare ms_crs_syscom  CURSOR LOCAL
            FOR select text from syscomments where id = @objid and encrypted = 0
                    ORDER BY number, colid
            FOR READ ONLY

        end

    /*
    **  else get the text.
    */
    select @LFCR = 2
    select @LineId = 1

    open ms_crs_syscom

    fetch next from ms_crs_syscom into @SyscomText

    while @@fetch_status >= 0
    begin
        select  @BasePos    = 1
        select  @CurrentPos = 1
        select  @TextLength = LEN(@SyscomText)

        while @CurrentPos  != 0
        begin
            --Looking for end of line followed by carriage return
            select @CurrentPos =   CHARINDEX(char(13)+char(10), @SyscomText, @BasePos)

            --If carriage return found
            IF @CurrentPos != 0
            begin
                /*If new value for @Lines length will be > then the
                **set length then insert current contents of @line
                **and proceed.
                */
                while (isnull(LEN(@Line),0) + @BlankSpaceAdded + @CurrentPos-@BasePos + @LFCR) > @DefinedLength
                begin
                    select @AddOnLen = @DefinedLength-(isnull(LEN(@Line),0) + @BlankSpaceAdded)
                    insert #CommentText values
                    ( @LineId,
                        isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText, @BasePos, @AddOnLen), N''))
                    select @Line = NULL, @LineId = @LineId + 1,
                            @BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0
                end

                -- 注释系统原来的使用如下修改
                --select @Line    = isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText, @BasePos, @CurrentPos-@BasePos + @LFCR), N'')
                select @Line    = isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText, @BasePos, @CurrentPos-@BasePos + (CASE @keeporiginal WHEN 1 THEN @LFCR ELSE 0 END)), N'')
                select @BasePos = @CurrentPos+2
                insert #CommentText values( @LineId, @Line )
                select @LineId = @LineId + 1
                select @Line = NULL
            end
            else
            --else carriage return not found
            begin
                IF @BasePos <= @TextLength
                begin
                    /*If new value for @Lines length will be > then the
                    **defined length
                    */
                    while (isnull(LEN(@Line),0) + @BlankSpaceAdded + @TextLength-@BasePos+1 ) > @DefinedLength
                    begin
                        select @AddOnLen = @DefinedLength - (isnull(LEN(@Line),0) + @BlankSpaceAdded)
                        INSERT #CommentText VALUES
                        ( @LineId,
                            isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText, @BasePos, @AddOnLen), N''))
                        select @Line = NULL, @LineId = @LineId + 1,
                            @BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0
                    end
                    select @Line = isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText, @BasePos, @TextLength-@BasePos+1 ), N'')
                    if LEN(@Line) < @DefinedLength and charindex(' ', @SyscomText, @TextLength+1 ) > 0
                    begin
                        select @Line = @Line + ' ', @BlankSpaceAdded = 1
                    end
                end
            end
        end

        FETCH NEXT from ms_crs_syscom into @SyscomText
    end

    IF @Line is NOT NULL
        INSERT #CommentText VALUES( @LineId, @Line )

    select Text from #CommentText order by LineId

    CLOSE  ms_crs_syscom
    DEALLOCATE     ms_crs_syscom

    DROP TABLE     #CommentText    

    return (0) -- sp_helptext
end
go

经过上述三种艺术的对待,大家能够看见那叁个方式都不能够将上述表格中列出的目的类型的定义全体都知足,为了缓和这一个不足,大家将组成那些成效来封装在三个仓库储存(其名目为dbo.usp_helptext2)。必要注意的一点就是服务器触发器本来不是有些数据库中的对象的,服务器触发器和数据库中可编制程序对象分别更加好的知道,也能大约些的,可是为了查询的便利性,大家此番封装的积累达成服务器触发器定义查看。

 

 

上述纠正之处笔者早已标明了,别的的均来源sys.sp_helptext内容。

效果结合的囤积进度T-SQL代码如下:

那就看重视构后的机能,如下图:

IF OBJECT_ID(N'[dbo].[usp_helptext2]', 'P') IS NOT NULL
BEGIN
    DROP PROCEDURE [dbo].[usp_helptext2];
END
GO

--==================================
-- 功能: 查看可编程对象定义
-- 说明: 支持用户定义类型,可以运行于SQL Server 2005+
-- 创建: yyyy-MM-dd hh:mm-hh:mm XXX 创建内容描述
-- 修改: yyyy-MM-dd hh:mm-hh:mm XXX 修改内容描述
--==================================
CREATE PROCEDURE [dbo].[usp_helptext2]
(
     @nvcObjectName AS NVARCHAR(776)                    -- 对象名称,可以支持的对象类型为(C、D、FN、IF、P、R、RF、TF、TR、U、V)
    ,@nvcComputedColumnName AS NVARCHAR(128) = NULL        -- 计算列名称(如果@nvcObjectName的对象类型为U,则该参数表示计算列名称)
)
AS
BEGIN
    SET NOCOUNT ON;

    SET @nvcObjectName = ISNULL(@nvcObjectName, N'');
    IF (@nvcObjectName = N'')
    BEGIN
        RAISERROR(16902, -1, -1,N'usp_helptext2', N'@nvcObjectName');
        RETURN(1);
    END

    SET @nvcComputedColumnName = ISNULL(@nvcComputedColumnName, N'');

    DECLARE @tntRetVal AS TINYINT;
    SET @tntRetVal = 0;

    DECLARE @tblObjDef AS TABLE (
        [Text] NVARCHAR(1000) NULL
    );

    DECLARE
         @intObjectID AS INT
        ,@chaType AS CHAR(2)
        ,@nvcText AS NVARCHAR(MAX);
    SELECT
         @intObjectID = 0
        ,@chaType = ''
        ,@nvcText = N'';
    SELECT
         @intObjectID = [object_id]
        ,@chaType = [type]        
    FROM [sys].[all_objects]
    WHERE 
        [type] IN ('C', 'D', 'FN', 'IF', 'P', 'R', 'RF', 'TF', 'TR', 'U', 'V')
        AND [name] = PARSENAME(@nvcObjectName, 1);

    IF (@nvcComputedColumnName > N'')    -- 获取计算列定义
    BEGIN
        IF (@chaType NOT IN ('S', 'U', 'TF'))
        BEGIN
            RAISERROR(15218, -1, -1, @nvcObjectName);
            RETURN(1);
        END

        INSERT INTO @tblObjDef ([Text])        
        EXEC [sys].[sp_helptext]
             @objname = @nvcObjectName                -- nvarchar(776)
            ,@columnname = @nvcComputedColumnName    -- sysname

        IF(@@ROWCOUNT = 0)
        BEGIN
            SET @tntRetVal = 1;
        END

        SELECT 
            @nvcText = ISNULL([Text], N'')
        FROM @tblObjDef;            
    END
    ELSE IF (@intObjectID <> 0)    -- 获取除计算列和服务器触发器以外的所有对象类型的定义
    BEGIN
        SET @nvcText = OBJECT_DEFINITION(@intObjectID);

        IF(@@ROWCOUNT = 0)
        BEGIN
            SET @tntRetVal = 1;
        END
    END
    ELSE IF (@intObjectID = 0)    -- 尝试获取服务器触发器定义
    BEGIN
        SELECT 
            @nvcText = T1.[definition]
        FROM [sys].[server_sql_modules] AS T1
            INNER JOIN [sys].[server_triggers] AS T2
                ON [T1].[object_id] = [T2].[object_id]
        WHERE T2.[name] = @nvcObjectName;

        IF(@@ROWCOUNT = 0)
        BEGIN
            SET @tntRetVal = 1;
        END
    END

    SELECT 
        @nvcText AS [Text];

    RETURN(@tntRetVal);
END
GO

金沙棋牌app手机下载 5

 

金沙棋牌app手机下载 6

上述存款和储蓄dbo.usp_helptext2能够完全落到实处以上表格的装有可编制程序对象定义查看,无论是系统定义的要么顾客定义的,前提是以上表格中的可编程对象类型定义。当然也设有欠缺正是可编制程序对象定义输出到SSMS客商端超越最大规模(SQL Server 贰零壹贰境遇中的时43679双字节字符长度)将在现身截断,这几个毛病能够经过代码编制程序来周详化解那些毛病。

以上显示并看不出和sys.sp_helptext的有什么区别,继续讲Text内容复制归入单独为文件中效果如下图:

 

金沙棋牌app手机下载 7

**3、dbo.helptext2的选拔性测验
**

金沙棋牌app手机下载 8

 

上航海用体育场地雪白矩形框就是显得的魔法,下局地是为着比较,那生机勃勃部分能够接收如下代码显示器效果:

客商定义检查约束测验:

EXEC [sys].[sp_helptext]
     @objname = N'sys.fn_get_sql'    -- nvarchar(776)
    ,@columnname = NULL -- sysname
GO

EXEC [dbo].[usp_helptext]
     @objname = N'sys.fn_get_sql'    -- nvarchar(776)
    ,@columnname = NULL -- sysname
    ,@keeporiginal = 1 -- bit
GO

金沙棋牌app手机下载 9

 

金沙棋牌app手机下载 10

 

客商定义约束测验:

注意:dbo.usp_helptext兼容了sys.sp_helptext的功能。

金沙棋牌app手机下载 11

 

金沙棋牌app手机下载 12

3、sys.sp_helptext和dbo.usp_helptext的界定以致缓和方案

系统定义存款和储蓄测验:

 

金沙棋牌app手机下载 13

查阅了sys.sp_helptext的源码和其对应的联机帮忙文书档案,开掘其出口的字段列Text每行最多252个双字节字符,其出口到顾客端最后的大大小小是4000个双字节字符,那几个能够通过编码程序(比如VS程序读取获取等卡塔 尔(阿拉伯语:قطر‎突破这一个界定。

金沙棋牌app手机下载 14

 

客户定义计算列测验:

其最大的老毛病是每行251个,有非常的大概率遭遇风华正茂行中一个相间符前有些归于前一个254个双字节字符,后意气风发局地归于后一个255双字节字符的前有个别。

金沙棋牌app手机下载 15

切实的测验代码如下:

金沙棋牌app手机下载 16

IF OBJECT_ID(N'[dbo].[uvm_MyTestView]', 'V') IS NOT NULL
BEGIN
    DROP VIEW [dbo].[uvm_MyTestView];
END
GO    

CREATE VIEW [dbo].[uvm_MyTestView]
AS
    SELECT 
          1 AS N'Col_1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111', 2 AS [Col_2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222]
GO

 

 

数据库DDL触发器测量试验

作用显示如下图:

金沙棋牌app手机下载 17

金沙棋牌app手机下载 18

金沙棋牌app手机下载 19

金沙棋牌app手机下载 20

服务器触发器测量试验:

上海教室展现的功用就是出新了截断。祛除那么些节制那就选拔函数object_definition(可是那几个也是有劣势的,未来才单独批注输出可编制程序对象定义的源委的区分)。

金沙棋牌app手机下载 21

 

金沙棋牌app手机下载 22

4、总结语

任何对象类型的测量试验不在全体点数。

 

 

上学sql server提供的种类对象,开采她们写的代码真的很紧密的,超级多规范以致那个管理等,确实学到了重重的,但是也开采存点sql server的里边节制是不写出来的,如表记录行最大8060字节的限量以至可边长长度溢出到row-overflow索引分配项指标数据页后也在本来的记录行中追加24字节的指针那样也可有能超过行最大8060字节的界定。大概小编看理论太少的因由吧。唯有继续精进,代码编制程序照旧要延续的,有时候sql server顾客端输出的最大4000个双字节字符的节制能够经过编制程序的不二秘诀赢得完本的毁灭。

4、总结语

 

 

前几日看来园中的风度翩翩篇博文print、sp_helptext的限量与强大透过PSportageINT输出分批次打字与印刷超长的字符串,也会遭逢有个别标记符截断的难点,因为P逍客INT每一次到打字与印刷到顾客端总增添了char(13)和char(10)那七个字符,那样就或者将三个标记符分割为上下七个批次。

在这一次的读书和钻探,sql server系统自带的视图以至存款和储蓄进度针对可编制程序对象的落实很很周详的,可是叶分散在不一致之处,本次结合约等于将分散在分化地点的会面在一齐提供联合入口来处理。如若不想查看总计列和服务器触发器的定义以外的装有可编制程序对象类型的概念,提出采取object_definition函数,该函数差相当的少提供了很圆满的作用。此次学习也意识数据库DDL触发器在sys.object是回天无力查见到的,需求在sys.triggers或sys.all_objects目录视图中查看见,这几个也在object_id函数做了限制的。由于服务器触发器自身归于服务器的,这么些sql server团队本人也是用了系统表sys.sysschobjs、sys.syspalnames 、sys.syspalvalues,尽管sys.all_objects也是用了系统表sys.syscheobjs,但是却在sys.all_objects中无法查询到的,也在object_id函数中做了限制,只好在sys.server_triggers查询到,这从逻辑上进行了分手,也切合服务器触发器的着落性质。

 

 

5、参谋项目清单列表

希望以此组成的查看可编制程序对象定义的存放,能够帮忙到必要的人。继续精进,继续追究sql server。

 

 

5、仿照效法项目清单列表

  •  

本文由金沙棋牌发布于金沙棋牌app手机下载,转载请注明出处:server查询可编程对象定义的方式对比以及整合

关键词: