Как сделать ошибку в SQL Server 2016, совместимом с SQL Server 2008 - PullRequest
0 голосов
/ 02 июля 2019

Я написал скрипт, который проверяет ссылки на объекты в версиях SQL Server с 2008 по 2016 год.

В SQL Server 2008 RaiseError работает нормально, но в SQL Server 2016, когда я использую TRY-CATCH, я не вижу ошибок в сообщениях, даже если они возникают.

Как это сделать, чтобы работать также на версии 2016 года и быть совместимым вплоть до версии SQL Server 2008?

BEGIN TRY
    INSERT INTO @refTable
        SELECT
            @nestLevel,
            @referencingEntityFullName AS referencing_object_name,
            OBJECT_ID(@referencingEntityFullName) AS referencing_object_id,
            r.referencing_minor_id, --if > 0 then computed column
            r.referenced_server_name,
            r.referenced_database_name,
            r.referenced_schema_name,
            r.referenced_entity_name,
            r.referenced_minor_name,
            r.is_caller_dependent, --warning on these!
            r.is_ambiguous--,
            --r.is_selected,
            --r.is_updated,
            --r.is_select_all,
            --r.is_insert_all,
            --r.is_all_columns_found
        FROM
            sys.dm_sql_referenced_entities(@referencingEntityFullName, 'OBJECT') r
        WHERE
            r.referenced_entity_name = @currentReferencedEntityName
            AND (@filterColumns = 0 OR 
                    r.referenced_minor_name IN (SELECT ColumnName 
                                                FROM @piiTablesAndColumns ptac 
                                                WHERE ptac.TableName = @currentReferencedEntityFullName)
                 OR r.referenced_minor_name IS NULL --for SELECT *; check if it really works this way
                )
    END TRY
    BEGIN CATCH
        print('catched!' + @referencingEntityFullName + CAST(OBJECT_ID(@referencingEntityFullName) AS NVARCHAR(1000)))

        INSERT INTO @refTable (referencing_object_name, referencing_object_id, referenced_entity_name) 
        VALUES (@referencingEntityFullName, OBJECT_ID(@referencingEntityFullName), (SELECT top 1 referenced_entity_name FROM sys.sql_expression_dependencies WHERE referencing_id=OBJECT_ID(@referencingEntityFullName) and referenced_entity_name in (select replace(TableName,'dbo.','') from @piiTablesAndColumnsTmp)))
        RAISERROR('error',255,255)
    END CATCH
...