我正在开发一个SSIS包,它使用来自源SQL和目标FLATFILE的数据。
我面临的一个挑战,请帮助我如何解决它。
上游每2周在SQL源中创建一个新表,如何处理这种情况?我不想每次为新创建的表修改SSIS包。新表的Schema不相同
是否有任何方法来处理这个配置文件或任何控制文件。或者为了实现这一点,我是否需要转换到不同的技术堆栈。请帮助
许多感谢
"新表的Schema不相同">
那么SSIS数据流不是适合你的技术。数据流与源元数据和目标元数据紧密绑定,改变模式是行不通的1。
"我需要切换到不同的技术堆栈">
也许吗?也许不是。作为一个执行框架,SSIS仍然可以提供本地日志记录、配置和对本机组件主机的访问,以及为您可能需要做的任何其他事情提供. net运行时。
I如何解决这个问题?
如果您需要将任意表的内容导出为平面文件,我会使用我信任的朋友BCP
作为一个示例调用,下面将使用集成安全性
将名为MyTable
的表导出到一个以制表符分隔的文件bcp dbo.MyTable out "C:tempAdventureWorks.dbo.MyTable.txt" -S ERECHDEV2019UTF8 -d AdventureWorks -T -c -a 32768
您可以通过执行进程任务从SSIS调用bcp。
如何处理表名的变化?可能是像
这样的查询-- Generate a list of tables created in the past 16 days
-- Make the table name safe for consumption by BCP via quotename
SELECT
CONCAT(QUOTENAME(S.name), '.', QUOTENAME(T.name)) AS QualifiedTable, T.create_date
FROM
sys.schemas AS S
INNER JOIN
sys.tables AS T
ON T.schema_id = S.schema_id
WHERE
T.create_date > DATEADD(DAY, -16, GETDATE())
ORDER BY T.create_date DESC;
1你可以让它工作假设总是有共同的核心元素,你只需要导出这些实体。
例如,给定这些表定义,您可以提取前3列,在源查询中使用一些类型转换,并始终填充输出文件
CREATE TABLE dbo.Week0
(
id varchar(10)
, Col1 float
, Col2 int
, ExtraColumn varchar(50)
);
CREATE TABLE dbo.Week1
(
externalId int
, Col11 float
, Col2 varchar(50)
);
这将是大量的动态查询生成和希望和猜测,但它可以完成,但可能不应该。