• SQL Server查询代码在哪个视图、存储过程、函数、触发中使用过


    工作中偶尔会出现:想用A数据表替换B数据表,然后把B数据表删除。但是,又不知道B数据表在哪个视图、存储过程、函数、触发器中使用过?

        经过一番度娘,看到实现方法也不难,主要涉及两个系统表:sysobjects及syscomments。

        1、先来复习一下sysobjects表结构。

    列名

    数据类型

    描述

    name

    sysname

    对象名。

    id

    int

    对象标识号。

    xtype

    char(2)

    对象类型。可以是下列对象类型中的一种: 

    C = CHECK 约束

    D = 默认值或 DEFAULT 约束

    F = FOREIGN KEY 约束

    L = 日志

    FN = 标量函数 

    IF = 内嵌表函数 

    P = 存储过程 

    PK = PRIMARY KEY 约束(类型是 K)

    RF = 复制筛选存储过程

    S = 系统表 

    TF = 表函数 

    TR = 触发器 

    U = 用户表 

    UQ = UNIQUE 约束(类型是 K)

    V = 视图 

    X = 扩展存储过程

    uid

    smallint

    所有者对象的用户 ID。

    info

    smallint

    保留。仅限内部使用。

    status

    int

    保留。仅限内部使用。

    base_schema_ ver

    int

    保留。仅限内部使用。

    replinfo

    int

    保留。供复制使用。

    parent_obj

    int

    父对象的对象标识号(例如,对于触发器或约束,该标识号为表 ID)。

    crdate

    datetime

    对象的创建日期。

    ftcatid

    smallint

    为全文索引注册的所有用户表的全文目录标识符,对于没有注册的所有用户表则为 0。

    schema_ver

    int

    版本号,该版本号在每次表的架构更改时都增加。

    stats_schema_ ver

    int

    保留。仅限内部使用。

    type

    char(2) 

    对象类型。可以是下列值之一:

    C = CHECK 约束

    D = 默认值或 DEFAULT 约束

    F = FOREIGN KEY 约束

    FN = 标量函数

    IF = 内嵌表函数

    K = PRIMARY KEY 或 UNIQUE 约束

    L = 日志

    P = 存储过程

    R = 规则

    RF = 复制筛选存储过程

    S = 系统表

    TF = 表函数

    TR = 触发器

    U = 用户表

    V = 视图

    X = 扩展存储过程

    userstat

    smallint 

    保留。

    sysstat

    smallint 

    内部状态信息。

    indexdel

    smallint

    保留。

    refdate

    datetime

    留用。

    version

    int 

    保留。

    deltrig 

    int 

    保留。

    instrig

    int 

    保留。

    updtrig

    int 

    保留。

    seltrig

    int 

    保留。

    category

    int

    用于发布、约束和标识。

    cache

    smallint 

    保留。

       2、顺便记录一下sysobjects的一些经典用法,比如说查表是否存在?

    --方法1:
    IF EXISTS (SELECT 1 FROM DBO.SYSOBJECTS WHERE ID=OBJECT_ID(N'[DBO].[表名]') AND OBJECTPROPERTY(ID, N'ISUSERTABLE')=1)
        DROP TABLE [DBO].[表名]
    
    --方法2:
    IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE XTYPE='U' AND NAME='表名')
        DROP TABLE [DBO].[表名]

        3、言归正传,重点来了:比如查一个表如  [RC_位数]  在哪些代码中使用过?

    SELECT A.NAME 来源名称,B.TEXT 代码内容,
        CASE
            WHEN A.XTYPE='V' THEN '视图'
            WHEN A.XTYPE='P' THEN '存储过程'
            WHEN A.XTYPE='FN' THEN '标量函数'
            WHEN A.XTYPE='TF' THEN '表函数'
            WHEN A.XTYPE='TR' THEN '触发器'
            ELSE A.XTYPE
        END 类型
    FROM SYSOBJECTS A INNER JOIN SYSCOMMENTS B ON A.ID=B.ID
    WHERE B.TEXT LIKE '%RC_位数%'
    ORDER BY 类型

        结果如下:

        需要说明的是,假如代码如存储过程使用 WITH ENCRYPTION 等方式加密过时,是查不到结果的。因为加密过的内容,在syscomments中会显示为NULL。

    --RC_COST_CO是加密过的存储过程
    SELECT A.NAME 来源名称,B.TEXT 代码内容,
        CASE
            WHEN A.XTYPE='V' THEN '视图'
            WHEN A.XTYPE='P' THEN '存储过程'
            WHEN A.XTYPE='FN' THEN '标量函数'
            WHEN A.XTYPE='TF' THEN '表函数'
            WHEN A.XTYPE='TR' THEN '触发器'
            ELSE A.XTYPE
        END 类型
    FROM SYSOBJECTS A INNER JOIN SYSCOMMENTS B ON A.ID=B.ID
    WHERE A.NAME = 'RC_COST_CO'
    ORDER BY 类型

        结果如下:

     
  • 相关阅读:
    506Relative Ranks(LeetCode)
    计算二进制中1的个数
    vector<vector<int>> 简单知识介绍
    167. Two Sum II
    561. Array Partition I(LeetCode)
    sizeof 用法部分总结
    530. Minimum Absolute Difference in BST(LeetCode)
    JS计算两个日期之间的天数
    路演会上会登记结论的委员信息页面
    eclipse安装SVN插件
  • 原文地址:https://www.cnblogs.com/karkash/p/16213145.html
Copyright © 2020-2023  润新知