如何比较暂存表和操作表之间的数据?

Nin*_*per 1 sql-server etl except

我只是想问如何比较两个数据库表,暂存表与操作表。

在我们进行转换并将其转换为正确的数据类型后,例如将flag列 (Y/N)转换nvarcharbit或到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操作这里