我在数据库中有很多 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/