SQL Server 2008 r2 : How to check all views for runtime errors?

标签 sql sql-server sql-server-2008 view runtime-error

我在数据库中有很多 View 。 每个 View ofc 引用一个或多个表。 对这些表做了一些工作(更改、删除列),现在我需要检查所有 View 是否有任何运行时错误。

我直截了当:获取所有 View 的列表,对其进行迭代并动态启动 SELECT TOP 0 * FROM view_name,以便任何错误都应显示在“消息” Pane 中。

这是我的代码

DECLARE @view_name_template varchar(max) = '%'
DECLARE @columnList varchar(75) = '*'
--------------------------
DECLARE @tmp_views AS TABLE (view_name varchar(max))
DECLARE @view_name varchar(max)
DECLARE @sqlCommand nvarchar(max)
DECLARE @num int = 1
DECLARE @total_count int

SET NOCOUNT ON

INSERT INTO @tmp_views 
SELECT name FROM sys.views
WHERE name LIKE @view_name_template

SELECT @total_count = COUNT(*) FROM sys.views WHERE name LIKE @view_name_template

DECLARE db_cursor CURSOR FOR  
    SELECT view_name FROM @tmp_views ORDER BY LOWER(view_name)

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @view_name

WHILE @@FETCH_STATUS = 0  
BEGIN  
       SET @sqlCommand = 'SELECT TOP 0 ' + @columnList + ' FROM ' + @view_name
       PRINT CAST(@num as varchar(31)) + '/' + CAST(@total_count as varchar(31)) + ' ' + @sqlCommand

       EXECUTE sp_executesql @sqlCommand

       FETCH NEXT FROM db_cursor INTO @view_name         
       SET @num = @num + 1
END  

CLOSE db_cursor  
DEALLOCATE db_cursor 

它工作正常,除了它在某些 View 上完全卡住(从其他窗口中的那些 View 中选择工作非常快速和良好)。我认为这是服务器内存溢出问题或类似问题。

请告诉我:检查 View 是否有错误的最轻量级方法是什么?也许 SQL Server 有一个特殊的函数或存储过程?

最佳答案

代码没有“挂”。它正在等待 View 运行,尽管 top 0

SQL Server 提供了多种测试查询的方法。除了 top 0 之外,您还有:

  • `设置parseonly1
  • 设置 noexec 为

然后是最近的 sp_describe_first_result_set

这些中的每一个都做不同的事情。 parseonly 检查语法错误但不查看表格布局。我相信 noexec 完全编译查询,创建执行计划。 top 0 将编译查询并运行它。

在某些情况下,优化器可能无法识别不返回任何行的查询可能不需要执行任何操作。例如,尽管 top 0 仍可能运行子查询,这会导致延迟。

两种方法。第一种是使用 noexec on(已记录 here)。第二种,如果可行的话,将创建另一个具有相同结构但没有数据的数据库。然后,您可以在该数据库上测试查询。

关于SQL Server 2008 r2 : How to check all views for runtime errors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24488798/

相关文章:

asp.net - 插入图像并更新它(如果存在)

sql - 审核 SQL Server 数据更改

sql - 在 SQL 语句中构建动态 where 条件

php - 如何在 WHERE row = (?) SQL php 语句中放置多个值

java - 将 jtextbox 值和 jradiobutton 值插入数据库

c# - 如何在 Entity Framework 中设置默认值

带条件的 SQL 插入查询

php - 如何处理PDO事务错误并告知客户端结果呢?

mysql - 具有来自第二个表的子查询范围的 SQL 查询表

c# - 必须声明标量变量@