sql-server - 如何确定别名临时表与持久表上的 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;
解决方案
推荐阅读
- validation - Ghostscript 作为 PDF 验证器:命令和结果
- java - 为什么这个递归循环等于 200?
- r - 如何计算 XML 文件中的数字(字符串格式)
- java - 如何为具有 yolo 输出层的多任务学习网络准备数据集?
- mysql - St_within 用于获取 10 英里半径的 MBR mysql
- php - 如何根据php中列的最大值从数组对象中获取数组对象
- sql-server - 在 SQL Server 中进行正向还原是否安全?
- javascript - Flutter - 在 null 上调用了“then”方法
- windows - SourceTree 在版本更新后不会自动刷新
- google-apps-script - 使用 onEdit 添加复选框,作为新行添加到电子表格 - 应用程序脚本