SQL Server SSIS开发-如何处理每15天在源创建一次新表

qxsslcnc  于 2023-01-01  发布在  其他
关注(0)|答案(1)|浏览(139)

我正在开发一个SSIS包,它使用来自源SQL和目标FLATFILE的数据。
我面临的一个挑战,请帮助我如何解决它。
上游每两周在SQL源中创建一个新表,如何处理这种情况。我不想每次都为创建的新表修改SSIS包。新表的架构不一样。
有没有办法通过配置文件或任何控制文件来处理这个问题。或者为了实现这个目标,我需要转移到不同的技术栈吗?请帮助
多谢

jtjikinw

jtjikinw1#

“新表的架构不相同”

那么SSIS数据流就不是适合你的技术,因为数据流与源和目标元数据是紧密绑定的,改变模式是行不通的。

“我是否需要转移到不同的技术堆栈”

SSIS作为一个执行框架仍然可以提供一些好处,它具有本机日志记录、配置和对许多本机组件的访问,以及.NET运行时,可以执行您可能需要执行的任何其他操作。

* 我 * 会如何解决这个问题?

假设您需要将任意表的内容导出到平面文件中,我将使用我的信任朋友BCP
作为一个示例调用,下面将使用集成安全性将名为MyTable的表导出到制表符分隔的文件

bcp dbo.MyTable out "C:\temp\AdventureWorks.dbo.MyTable.txt" -S ERECH\DEV2019UTF8 -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)
);

这将是大量的动态查询生成和希望和猜测,但它 * 可以 * 做,但可能不应该。

相关问题