首页 > 解决方案 > 如何确定别名临时表与持久表上的 SQL Server 依赖项之间的差异

问题描述

我正在开发 SQL Server 2017。

我正在开发将检测和报告对不存在的表的存储过程引用的功能(可能是因为该表从未正确创建、删除或在不修改相关代码的情况下重命名。

然而,我遇到了一个关于别名临时表的问题。我不想报告对不存在的临时表的引用(因为无论如何它们只会在运行时创建)似乎在某些情况下 sys.sql_expression_dependencies 对不存在的持久表的引用,并且对别名临时表的引用看起来相同。

我希望对于临时表,referenced_database_name 可能是 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;

标签: sql-serverdependenciestemp-tablessql-server-2017

解决方案


推荐阅读