我们在继承的数据库中有大量视图,其中某些视图缺少依赖项(表或其他视图)?
识别缺少依赖项的视图的最佳方法是什么?
DECLARE @stmt nvarchar(max) = '' DECLARE @vw_schema NVARCHAR(255) DECLARE @vw_name varchar(255) IF OBJECT_ID('tempdb..#badViews') IS NOT NULL DROP TABLE #badViews IF OBJECT_ID('tempdb..#nulldata') IS NOT NULL DROP TABLE #nulldata CREATE TABLE #badViews ( [schema] NVARCHAR(255), name VARCHAR(255), error NVARCHAR(MAX) ) CREATE TABLE #nullData ( null_data varchar(1) ) DECLARE tbl_cursor CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR SELECT name, SCHEMA_NAME(schema_id) AS [schema] FROM sys.objects WHERE type='v' OPEN tbl_cursor FETCH NEXT FROM tbl_cursor INTO @vw_name, @vw_schema WHILE @@FETCH_STATUS = 0 BEGIN SET @stmt = 'SELECT TOP 1 * FROM [' + @vw_schema + N'].[' + @vw_name + ']' BEGIN TRY INSERT INTO #nullData EXECUTE sp_executesql @stmt END TRY BEGIN CATCH IF ERROR_NUMBER() != 213 BEGIN INSERT INTO #badViews (name, [schema], error) values (@vw_name, @vw_schema, ERROR_MESSAGE()) END END CATCH FETCH NEXT FROM tbl_cursor INTO @vw_name, @vw_schema END CLOSE tbl_cursor -- free the memory DEALLOCATE tbl_cursor SELECT * FROM #badViews DROP TABLE #badViews DROP TABLE #nullData
更新2017
根据@robyaw的答案更新了答案。
我还修复了select语句中计算值的错误。包含类似我们说的列SELECT TOP 1 NULL from vwTest时,似乎没有引发错误,但确实引发了异常。vwTest``1/0 as [Col1]``SELECT TOP 1 * from vwTest
SELECT TOP 1 NULL from vwTest
vwTest``1/0 as [Col1]``SELECT TOP 1 * from vwTest
Update 2018 修复了名称中包含特殊字符的视图和/或架构的误报。感谢@LucasAyala