我们知道,如视图中的基础表的字段发生了变化,则视图可能会变不可用。如果我们的数据库中定义了大量的视图,而基础表的变化也比较大,这时候如果要我们一个一个的去确定视图是不是能够正确执行,那岂不是一件工作量非常大的事情,今天小编在整理自己以前做的一个小工具的时候,在小工具发现了以前做的自动检测数据库中所有视图的正确性的方法,贴出来供大家参考:
在这个方法中用到了
sp_refreshview存储过程,该存储过程
用于更新指定的未绑定到架构的视图的元数据。如果视图的基础表发现了变化,我们可以使用sp_refreshview '视图表'来更新该视图,使该视图与基础表的字段同步,不至于出现视图列错位的情况。而如果视图中用到的字段在基础表中被删除了,则sp_refreshview会报出错误,所以,利用这个存储过程,我们就可以检测视图的可用性了。
整个方法定义如下:
/// <summary >
/// 获取所有视图验证结果
/// </summary >
/// <returns ></returns >
public static DataTable GetReFreshView()
{
string sql = "select name from sys.views";
using (SqlConnection conn = SqlConn())
{
conn.Open();
using (SqlCommand cmd = InitSqlCommand(conn, sql))
{
DataTable dt = new DataTable();
dt.Columns.Add("message", typeof(string));
DataSet ds = Query(cmd);
foreach (DataRow dr in ds.Tables[0].Rows)
{
sql = @"
declare @error varchar(50)
begin try
exec sp_refreshview " + dr["name"].ToString() + " set @error='视图" + dr["name"].ToString() + "验证成功!' end try begin catch set @error='视图" + dr["name"].ToString() + "验证失败\r\n'+error_message() end catch select @error";
cmd.CommandText = sql;
object result = cmd.ExecuteScalar();
dt.Rows.Add(result.ToString());
}
return dt;
}
}
}
该方法中用到了sqlserver的目录视图sys.views,该视图返回数据库中所有的用户视图,具体用法可以参考本站以下链接:
利用SQL语句查询数据库中所有视图该方法首先是利用sys.views读出数据库中所有视图并存储到DataTable中,然后循环DataTable行,逐行利用sp_refreshview来检测视图的正确性,如果视图大多,可能会造成界面假死,所以在小编的工具中,这个是利用多线程来解决的。大家也可以试试在数据库中检测出所有结果后再返回给用户。