Nin*_*per 1 sql-server etl except
我只是想问如何比较两个数据库表,暂存表与操作表。
在我们进行转换并将其转换为正确的数据类型后,例如将flag列 (Y/N)转换nvarchar为bit或到int,如何比较两个表之间的数据?
小智 6
如果您想使用 T-SQL 和 SSIS,有几个选项。
您可以比较临时表和 ops 表上的键列以确定该行是否已经存在,这样您就可以知道是否需要执行 INSERT 或 UPDATE。
如果使用 SSIS,您可以使用查找组件。您的源组件将具有类似
SELECT keycol FROM OpsTable.查找组件将有一个类似的源
SELECT keycol FROM StagingTable.您可以使用“无匹配输出”选项来获取所有OpsTable不在StagingTable.
如果使用 T-SQL,您可以像这样使用 EXCEPT 运算符
SELECT keycol FROM OpsTable
EXCEPT
SELECT keycol FROM StagingTable
Run Code Online (Sandbox Code Playgroud)
如果您需要比较所有列(键列和非键列),您可以使用 HASHBYTES 并散列所有非键列进行比较。请注意,HASHBYTES 仅接受(VARCHAR、NVARCHAR 或 VARBINARY),因此您必须将任何 DATE 列或此类列转换为 VARCHAR。
SELECT keycol,
HASHBYTES('SHA1',col1 + col2 + ISNULL(convert(nvarchar(100),ColDate,109),'')
FROM OpsTable
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。
你可以在HASHBYTES更多信息,在这里和在EXCEPT操作这里。