sql-server - 解析 SQL 脚本以查找表依赖项和输出
问题描述
我目前有一大组 sql 脚本将数据从一个表转换到另一个表,通常是分步进行的,例如
select input3.id as cid
, input4.name as cname
into #temp2
from input3
inner join input4
on input3.match = input4.match
where input3.regdate > '2019-01-01';
truncate table output1;
insert into output1 (customerid, customername)
select cid, cname from #temp2;
我想将这些脚本“解析”成它们的基本输入和输出
in: input3, input4
out: output1
(不一定是这种格式,只是这个信息)
错误地标记临时表不是问题:
in: input3, input4, #temp2
out: #temp2, output1
花一点时间是可以的,但越自动化越好。
如何做到这一点?
我尝试过的事情包括
- 正则表达式(直截了当,但会错过边缘情况,主要是在评论中错误地标记表)
- 使用在线解析器列出数据库对象,手动进行后处理
- 考虑以编程方式解决它,但例如为此编写一个 C# 程序将花费太多时间
解决方案
我通常将脚本的内容包装到存储过程中,并将它们部署到表所在的同一个数据库中。如果您对 (power)shell 脚本和正则表达式足够熟悉,您甚至可以编写代码来为您完成这些工作。
从这一点开始,您有一些选择:
- 如果您需要完整的使用/参考报告,或者它是一次性任务,您可以利用sys.sql_expression_dependencies或其他类似的系统视图;
- 从该数据库创建 SSDT 数据库项目。在使数据库开发更容易和更一致的许多其他方面,SSDT 具有“查找所有引用”功能(
Shift+F12
热键),它显示代码中特定对象(或列)的所有引用。
AFAIK 他们都没有看穿动态 SQL,所以如果你有很多,你将不得不寻找其他地方。
推荐阅读
- r - 使用来自网站的文本创建数据框
- excel - 从指定帐户从 Excel 发送 Outlook 电子邮件
- reactjs - setState 后 useEffect() 完成并具有价值
- keras - 在 K-Fold Cross 验证中,在 keras 中在哪里创建模型对象?
- sql - oracle查询填补同一张表中缺失的数据
- c# - LINQ 方法可用于从 List 中提取单个元素
? - reactjs - 如何将 Laravel Sanctum 与两个不同的前端和后端域一起使用?
- java - 在 AEM 中,如何将项目环境放入我的 sling 模型中
- c++ - 迭代本身正在修改的容器的 C++ 惯用方式
- c# - 在 Azure Blob 存储中创建并上传到特定文件夹