我们定义的视图,基本上就是把多个表的结果按照一定的规则联合查询出来结果,或者是在视图应用函数对数据进行处理等。那么我们要如何把把视图中所引用的这些表啊函数的都查出来呢?当然,利用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 * 子句中(仅限对象级)。 |
&