【发布时间】:2021-04-26 11:36:20
【问题描述】:
我需要创建一个自动进程,在几个 *.dtsx(2017 版)中搜索正在使用哪些表,是否可以这样做?
最后,将包名保存在一个表中,以及该包中使用的是哪个表。
感谢您的宝贵时间
【问题讨论】:
标签: sql-server ssis ssis-2017
我需要创建一个自动进程,在几个 *.dtsx(2017 版)中搜索正在使用哪些表,是否可以这样做?
最后,将包名保存在一个表中,以及该包中使用的是哪个表。
感谢您的宝贵时间
【问题讨论】:
标签: sql-server ssis ssis-2017
有文档工具,你可以在这篇文章中找到一些例子:https://dbmstools.com/categories/ssis-documentation-tools。
如果你想自己做,那么它的范围可以从简单到非常复杂的任务。
最后一个.dtsx 是一个XML 文件。如果您知道要查找哪些表,并且只需要知道这些表是否在包中的某个位置命名,那么简单的搜索就可以为您提供答案。
现在,如果您需要知道哪些表以及它们在包中的使用方式(例如输入、输出、通过 OLE 或 sql 命令等),那么您可能需要使用 xpath 分析 XML 文件,通过powershell 或SQL 这可能非常复杂。
如果将包部署到 SSIS 目录,您可以在 SSISDB 表中找到一些信息。
如果启用了custom logs 并且包已经运行,您也许可以在logs 中获取信息。
【讨论】:
DTSX 基本上是 XML 文件。您可以将内容加载到 xml 变量并查询那里正在使用的表名。
Reference MSDN wiki link。为了您的需要,我稍微修改了代码。以下代码未经测试。
declare @t table
(
x xml
)
declare @ObjectName varchar(100) = <Your Object Name To be Searched>
INSERT @t
SELECT *
FROM OPENROWSET(BULK '<Full Package Path>',
SINGLE_BLOB) AS x;
WITH XMLNAMESPACES ('www.microsoft.com/SqlServer/Dts' AS DTS,'www.microsoft.com/sqlserver/dts/tasks/sqltask' AS SQLTask)
SELECT t.u.value('.','varchar(100)')
FROM DTSPackages
CROSS APPLY x.nodes('/DTS:Executable/DTS:Property[@DTS:Name="ObjectName"]')t(u)
WHERE
x.exist('//SQLTask:SqlTaskData[contains(./@SQLTask:SqlStatementSource,sql:variable("@ObjectName"))]')=1
【讨论】: