How do I identify views with broken dependencies in SQL Server?

前端 未结 5 1823
悲哀的现实
悲哀的现实 2021-01-02 01:40

We have a large number of views in an inherited database which some of them are missing dependencies (table or even other views)?

What\'s the best way to identify th

5条回答
  •  半阙折子戏
    2021-01-02 02:39

    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
    

    Update 2017

    Updated the answer as per @robyaw's answer.

    I've also fixed a bug in it for the computed values in the select statements. It seems SELECT TOP 1 NULL from vwTest doesn't throw an error when vwTest contains a column like let's say 1/0 as [Col1], but SELECT TOP 1 * from vwTest it does throw an exception.

    Update 2018 Fix false positives for views and or schema that contain special characters in their name. Thanks to @LucasAyala

提交回复
热议问题