SQL Server 2008 r2:如何检查所有视图的运行时错误?

Posted

技术标签:

【中文标题】SQL Server 2008 r2:如何检查所有视图的运行时错误?【英文标题】:SQL Server 2008 r2: How to check all views for runtime errors? 【发布时间】:2014-06-30 11:10:43 【问题描述】:

我在数据库中有很多视图。 c 的每个视图都引用一个或多个表。 对这些表进行了一些工作(更改、删除列),现在我需要检查所有视图是否存在任何 runtime 错误。

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

这是我的代码

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 

它工作正常,只是它在某些视图上完全冻结(从其他窗口中的那些视图中选择工作非常快和好)。我认为这是服务器内存溢出问题或类似问题。

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

【问题讨论】:

在您编辑的表格上,右键单击表格名称并单击“查看依赖项”以查看任何相关的对象/视图,这将使您的任务变得更加轻松 【参考方案1】:

代码没有“挂起”。尽管top 0,它仍在等待视图运行。

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

`set parseonly1 set noexec on

然后是最近的sp_describe_first_result_set

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

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

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

【讨论】:

我很好奇:是否存在优化器无法删除前 0 以下的所有运算符的情况?听起来像一个简单的优化。对于WHERE 0=1,它会可靠地删除所有内容。 @usr 。 . .我记得带有聚合的复杂子查询会导致这种行为。那是在 SQL Server 2008 上,从那时起优化器可能已经改进了。 只是语法检查不符合我的情况。我需要确切的运行时检查。 'set noexec on' 也不起作用,因为它什么也不输出 - 也不选择结果窗格中不输出的结果。我的 SQL Server 2008 r2 中没有“sp_describe_first_result_set”。 @DoctorCoder 。 . .然后考虑创建一个空的测试数据库并在那里测试查询。您可以使用 SQL Server Management Studio 在没有数据的情况下编写数据库脚本。

以上是关于SQL Server 2008 r2:如何检查所有视图的运行时错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 SQL Server 2008 R2 的服务包?

如何在 SQL Server 2008 R2 中的所有行中删除只有一个值的多列

SQL Server 2008 R2升级到SQL Server 2012 SP1

SQL Server 2008r2 检查语法的下划线没有显示出来怎么办

如何解决SQL Server 2008 无法连接到

SQL Server 2008 R2 - 将列转换为行并将所有值放在一列中