用于列的动态脚本在sql server中的两个表之间进行比较

时间:2018-03-26 13:20:39

标签: sql sql-server sql-server-2012

我有两个表,其中有28列。在生产环境中,SQL Server排序规则设置为区分大小写。

我必须检查如下的值:

UPPER(Target.SKU) <> UPPER(Source.SKU)
   OR UPPER(Target.PRC) <> UPPER(Source.PRC)
   OR UPPER(Target.PACKSIZE) <> UPPER(Source.PACKSIZE).

是否可以动态执行此操作,而无需重复UPPER语句 每列?

我只是想把它做得更整齐。请分享您的想法。

由于

2 个答案:

答案 0 :(得分:1)

我会做两件事: 首先,在逐行检查之前,检查两个表是否具有相同的内容

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM target_table

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM source_table

如果这些数字匹配,则两个表的内容非常非常可能相同。

如果数字不匹配,请逐行检查以查找不同的记录:

;with cte1 AS (
SELECT t.id, BINARY_CHECKSUM(*) AS checker
FROM target_table t
)

;with cte2 AS (
SELECT s.id, BINARY_CHECKSUM(*) AS checker
FROM source_table s
)

SELECT cte1.id, cte2.id
FROM cte1 
INNER JOIN cte2
ON cte1.id = cte2.id
AND cte1.checker <> cte2.checker

这应该返回表中特定的记录,这些记录在两个表中都不匹配。

答案 1 :(得分:0)

如果你的陈述中有其他逻辑,你可以先用该逻辑做一个子选择,然后选择字段为UPPER然后进行比较

select fields 
FROM (
Select UPPER(SKU), UPPER(PRC), UPPER(PACKETSIZE), otherfields
from table
where logic
)
WHERE Target. SKU <>  Source. SKU
OR  Target. PRC <> Source. PRC
OR  Target. PACKSIZE <>  Source. PACKSIZE