Я работаю на SQL Server 2017.
Я занимаюсь разработкой функциональности, которая будет обнаруживать и сообщать о хранимых процедурах ссылки на несуществующие таблицы (возможно, поскольку таблица никогда не создавалась должным образом, была удалена, или был переименован без изменения зависимого кода.
Я столкнулся с проблемой, связанной с псевдонимами временных таблиц. Я не хочу сообщать о ссылках на временные таблицы, которые не существуют (поскольку они будут создаваться только при запуске время в любом случае) Кажется, что в некоторых случаях в sys.sql_expression_dependencies ссылка на постоянную таблицу, которая не существует, и ссылка на временную таблицу с псевдонимом выглядят одинаково.
Я ожидаю, что, возможно, для временного table имя_референционной_базы_данных будет temp_db или что есть какой-то другой способ определить, что зависимость находится во временной таблице, так что я могу исключить ее из моих результатов, показывающих неверные ссылки.
Следующий код создаст проблему что я вижу с де информация о нерешенности Он создает две хранимые процедуры, одна обновляет псевдоним несуществующей постоянной таблицы, а другая создает временную таблицу и обновляет ее с использованием псевдонима. Sys.sql_expression_dependencies показывает зависимости от обоих псевдонимов, без значения referenced_id (что указывает на то, что он ссылается на несуществующий объект), и, кажется, нет никакого способа сказать, глядя на зависимость, какой из них может быть временная таблица.
CREATE OR ALTER PROCEDURE my_procedure
AS
BEGIN
UPDATE a_table
SET a_table.some_column = 0
FROM dbo.some_table a_table
WHERE 1 = 0;
END;
GO
CREATE OR ALTER PROCEDURE my_temp_procedure
AS
BEGIN
CREATE TABLE #temp_table
(
some_column INT
);
UPDATE a_temp_table
SET a_temp_table.some_column = 0
FROM #temp_table a_temp_table
WHERE 1 = 0;
END;
GO
SELECT *
FROM sys.sql_expression_dependencies;