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 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 2012 SP1