Я написал скрипт, который проверяет ссылки на объекты в версиях 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