欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » SQLServer教程 » 正文

热门阅读

利用sql查询视图中所有引用的表

创建时间:2011年12月04日 22:12  阅读次数:(9036)
分享到:
我们定义的视图,基本上就是把多个表的结果按照一定的规则联合查询出来结果,或者是在视图应用函数对数据进行处理等。那么我们要如何把把视图中所引用的这些表啊函数的都查出来呢?当然,利用sp_helptext打印出视图的定义也是一清二楚了。本章我们讲解另一个方法,利用sql查询出视图中所引用的所有对象。

该方法需要用到目录视图sys.sql_dependencies对在定义另一引用对象的Transact-SQL表达式或语句中引用的被引用的实体的每一依赖关系,都会在该视图中存在对应的一行,也就是说,在视图中每引用了一个表或者其它对象,都会在这个目录视图中存在一行数据。

利用sys.sql_dependencies目录视图,实现查询出视图中所有对象的方法如下:

一、获取所有视图的所有引用对象
public static DataTable GetReferencedView()
{
    using (SqlConnection conn = SqlConn())
    {
        conn.Open();

        string sql = @"select  A.name,A.referencedname,B.type from 
                         (
                        select distinct B.name,object_name(A.referenced_major_id) as referencedname
                         from sys.sql_dependencies A 
                        inner join sys.views B 
                        on A.object_id=B.object_id
                        )  A inner join sys.objects B on A.referencedname=B.Name order by A.name asc";

        using (SqlCommand cmd = InitSqlCommand(conn, sql))
        {
            return Query(cmd).Tables[0];
        }
    }
}


二、获取指定视图的所有引用对象
public static DataTable GetReferencedView(string viewname)
{
    using (SqlConnection conn = SqlConn())
    {
        conn.Open();

        string sql = @"
                    select  @viewname as name,
                    name as referencedname,
                    type  
                    from sys.objects 
                    where name in (
                    select distinct object_name(referenced_major_id) as referencedname
                     from sys.sql_dependencies 
                    where object_id=object_id(@viewname)
                    )";
        SqlParameter[] parame = { new SqlParameter("@viewname", SqlDbType.VarChar, 50) };
        parame[0].Value = viewname;

        using (SqlCommand cmd = InitSqlCommand(conn, sql, parame))
        {
            return Query(cmd).Tables[0];
        }
    }
}


如果对上面sql不理解的,可以参考下面sys.sql_dependencies列说明来理解。
列名 说明
class 标识被引用的实体的类:
0 = 对象或列(仅非架构绑定引用)
1 = 对象或列(架构绑定引用)
2 = 类型(架构绑定引用)
3 = XML 架构集合(架构绑定引用)
4 = 分区函数(架构绑定引用)
class_desc 被引用的实体的类的说明:
OBJECT_OR_COLUMN_REFERENCE_NON_SCHEMA_BOUND
OBJECT_OR_COLUMN_REFERENCE_SCHEMA_BOUND
TYPE_REFERENCE
XML_SCHEMA_COLLECTION_REFERENCE
PARTITION_FUNCTION_REFERENCE
object_id 引用对象的 ID。
column_id 如果引用 ID 是一列,则为引用列的 ID;否则为 0。
referenced_major_id 被引用的实体的 ID,由类的值解释,具体如下:
0、1 = 对象或列的对象 ID。
2 = 类型 ID。
3 = XML 架构集合 ID。
referenced_minor_id 被引用实体的 Minor-ID,由类的值解释,如下所示:
当 class =:
0, referenced_minor_id 为列 ID;如果不是列,则为 0。
1, referenced_minor_id 为列 ID;如果不是列,则为 0。
否则,referenced_minor_id = 0。
is_selected 选中了对象或列。
is_updated 更新了对象或列。
is_select_all 对象用在了 SELECT * 子句中(仅限对象级)。
&
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 38+32=? 的结果(结果是:70)
结  果: