在SQL Server中将NULL与字符串进行比较 MERGE DestinationTable AS D 将SourceTable用作 在D.Alternate_ID=S.ID上 当匹配和 ( D.ID.S.ID 或D.col1 S.col1 或者D.col2和S.col2 或D.col3 S.col3 或D.col4 S.col4 或D.col5 S.col5 或D.col6 S.col6 或者D.col7和S.col7 或D.col8 S.col8 )

在SQL Server中将NULL与字符串进行比较 MERGE DestinationTable AS D 将SourceTable用作 在D.Alternate_ID=S.ID上 当匹配和 ( D.ID.S.ID 或D.col1 S.col1 或者D.col2和S.col2 或D.col3 S.col3 或D.col4 S.col4 或D.col5 S.col5 或D.col6 S.col6 或者D.col7和S.col7 或D.col8 S.col8 ),sql,sql-server,tsql,Sql,Sql Server,Tsql,大家好,如果SourceTable中的任何列值已使用上面的Merge语句片段更改,我正在尝试更新DestinationTable 但是,如果目标列中有空值,源列中有字符串或位值,则比较D.col8 S.col8将返回false,因为SQL处理空值比较的方式不同。因此,DestinationTable不会使用SourceTable中的新值进行更新 处理这个问题的更好方法是什么。如果D.Col8为NULL,而S.Col8有一个字符串或位值,那么对于类似D.Col8 S.Col8 因此,如果在S.Co

大家好,如果SourceTable中的任何列值已使用上面的Merge语句片段更改,我正在尝试更新DestinationTable

但是,如果目标列中有空值,源列中有字符串或位值,则比较
D.col8 S.col8
将返回false,因为SQL处理空值比较的方式不同。因此,DestinationTable不会使用SourceTable中的新值进行更新

处理这个问题的更好方法是什么。如果D.Col8为NULL,而S.Col8有一个字符串或位值,那么对于类似
D.Col8 S.Col8

因此,如果在S.Col8中有一个值“Test”,在D.Col8中有一个值为NULL,那么我想将目标列从NULL更新为“Test”

试试以下方法:

MERGE  DestinationTable AS D 
USING  SourceTable AS S
ON D.Alternate_ID = S.ID
WHEN MATCHED AND
(
      D.ID <> S.ID
   OR D.col1 <> S.col1
   OR D.col2 <> S.col2
   OR D.col3 <> S.col3
   OR D.col4 <> S.col4
   OR D.col5 <> S.col5
   OR D.col6 <> S.col6
   OR D.col7 <> S.col7
   OR D.col8 <> S.col8
)
。。。
当匹配和
(
ISNULL(D.ID.)、S.ID
或ISNULL(D.col1,,)S.col1
或ISNULL(D.col2,,)S.col2
或ISNULL(D.col3,,)S.col3
或ISNULL(D.col4,,)S.col4
或ISNULL(D.col5,,)S.col5
或ISNULL(D.col6,,)S.col6
或ISNULL(D.col7,,)S.col7
或ISNULL(D.col8,,)S.col8
)
试试这个:

MERGE  DestinationTable AS D 
USING  SourceTable AS S
ON D.Alternate_ID = S.ID
WHEN MATCHED AND
(
      D.ID <> S.ID
   OR D.col1 <> S.col1
   OR D.col2 <> S.col2
   OR D.col3 <> S.col3
   OR D.col4 <> S.col4
   OR D.col5 <> S.col5
   OR D.col6 <> S.col6
   OR D.col7 <> S.col7
   OR D.col8 <> S.col8
)
。。。
当匹配和
(
ISNULL(D.ID.)、S.ID
或ISNULL(D.col1,,)S.col1
或ISNULL(D.col2,,)S.col2
或ISNULL(D.col3,,)S.col3
或ISNULL(D.col4,,)S.col4
或ISNULL(D.col5,,)S.col5
或ISNULL(D.col6,,)S.col6
或ISNULL(D.col7,,)S.col7
或ISNULL(D.col8,,)S.col8
)
将目标表合并为D
将SourceTable用作
在D.Alternate_ID=S.ID上
当匹配和
(
D.ID.S.ID
或(D.col1为空,S.col1不为空)
或(D.col1不为NULL,S.col1为NULL)
或D.col1 S.col1
或(D.col2为空,S.col2不为空)
或(D.col2不为NULL,S.col2为NULL)
或者D.col2和S.col2
或(D.col3为空,S.col3不为空)
或(D.col3不为空,S.col3为空)
或D.col3 S.col3
或(D.col4为空,S.col4不为空)
或(D.col4不为NULL,S.col4为NULL)
或D.col4 S.col4
或(D.col5为空,S.col5不为空)
或(D.col5不为空,S.col5为空)
或D.col5 S.col5
或(D.col6为空,S.col6不为空)
或(D.col6不为NULL,S.col6为NULL)
或D.col6 S.col6
OR(D.col7为NULL,S.col7不为NULL)
或(D.col7不为空,S.col7为空)
或者D.col7和S.col7
或(D.col8为空,S.col8不为空)
或(D.col8不为空,S.col8为空)
或D.col8 S.col8
)
将目标表合并为D
将SourceTable用作
在D.Alternate_ID=S.ID上
当匹配和
(
D.ID.S.ID
或(D.col1为空,S.col1不为空)
或(D.col1不为NULL,S.col1为NULL)
或D.col1 S.col1
或(D.col2为空,S.col2不为空)
或(D.col2不为NULL,S.col2为NULL)
或者D.col2和S.col2
或(D.col3为空,S.col3不为空)
或(D.col3不为空,S.col3为空)
或D.col3 S.col3
或(D.col4为空,S.col4不为空)
或(D.col4不为NULL,S.col4为NULL)
或D.col4 S.col4
或(D.col5为空,S.col5不为空)
或(D.col5不为空,S.col5为空)
或D.col5 S.col5
或(D.col6为空,S.col6不为空)
或(D.col6不为NULL,S.col6为NULL)
或D.col6 S.col6
或(D.col7为空,S.col7不为空)
或(D.col7不为空,S.col7为空)
或者D.col7和S.col7
或(D.col8为空,S.col8不为空)
或(D.col8不为空,S.col8为空)
或D.col8 S.col8
)
试试下面的方法

MERGE  DestinationTable AS D 
USING  SourceTable AS S
ON D.Alternate_ID = S.ID
WHEN MATCHED AND
(
      D.ID <> S.ID
   OR (D.col1 IS NULL AND S.col1 IS NOT NULL) 
      OR (D.col1 IS NOT NULL AND S.col1 IS NULL) 
      OR D.col1 <> S.col1
   OR (D.col2 IS NULL AND S.col2 IS NOT NULL) 
      OR (D.col2 IS NOT NULL AND S.col2 IS NULL) 
      OR D.col2 <> S.col2 
   OR (D.col3 IS NULL AND S.col3 IS NOT NULL) 
      OR (D.col3 IS NOT NULL AND S.col3 IS NULL) 
      OR D.col3 <> S.col3 
   OR (D.col4 IS NULL AND S.col4 IS NOT NULL) 
      OR (D.col4 IS NOT NULL AND S.col4 IS NULL) 
      OR D.col4 <> S.col4 
   OR (D.col5 IS NULL AND S.col5 IS NOT NULL) 
      OR (D.col5 IS NOT NULL AND S.col5 IS NULL) 
      OR D.col5 <> S.col5 
   OR (D.col6 IS NULL AND S.col6 IS NOT NULL) 
      OR (D.col6 IS NOT NULL AND S.col6 IS NULL) 
      OR D.col6 <> S.col6 
   OR (D.col7 IS NULL AND S.col7 IS NOT NULL) 
      OR (D.col7 IS NOT NULL AND S.col7 IS NULL) 
      OR D.col7 <> S.col7 
   OR (D.col8 IS NULL AND S.col8 IS NOT NULL) 
      OR (D.col8 IS NOT NULL AND S.col8 IS NULL) 
      OR D.col8 <> S.col8 
)
MERGE DestinationTable AS D
将SourceTable用作D.Alternate_ID=S.ID上的S
当匹配和
(
ISNULL(D.ID.))ISNULL(S.ID.))
或ISNULL(D.col1'')ISNULL(S.col1'')
或者ISNULL(D.col2',)ISNULL(S.col2',)
或者ISNULL(D.col3',)ISNULL(S.col3',)
或者ISNULL(D.col4'')ISNULL(S.col4'')
或者ISNULL(D.col5',)ISNULL(S.col5',)
或者ISNULL(D.col6'')ISNULL(S.col6'')
或者ISNULL(D.col7'')ISNULL(S.col7'')
或者ISNULL(D.col8',)ISNULL(S.col8',)
)
D.ID
S.ID
D.colx
S.colx
也可以是
Null
尝试以下操作

MERGE  DestinationTable AS D 
USING  SourceTable AS S
ON D.Alternate_ID = S.ID
WHEN MATCHED AND
(
      D.ID <> S.ID
   OR (D.col1 IS NULL AND S.col1 IS NOT NULL) 
      OR (D.col1 IS NOT NULL AND S.col1 IS NULL) 
      OR D.col1 <> S.col1
   OR (D.col2 IS NULL AND S.col2 IS NOT NULL) 
      OR (D.col2 IS NOT NULL AND S.col2 IS NULL) 
      OR D.col2 <> S.col2 
   OR (D.col3 IS NULL AND S.col3 IS NOT NULL) 
      OR (D.col3 IS NOT NULL AND S.col3 IS NULL) 
      OR D.col3 <> S.col3 
   OR (D.col4 IS NULL AND S.col4 IS NOT NULL) 
      OR (D.col4 IS NOT NULL AND S.col4 IS NULL) 
      OR D.col4 <> S.col4 
   OR (D.col5 IS NULL AND S.col5 IS NOT NULL) 
      OR (D.col5 IS NOT NULL AND S.col5 IS NULL) 
      OR D.col5 <> S.col5 
   OR (D.col6 IS NULL AND S.col6 IS NOT NULL) 
      OR (D.col6 IS NOT NULL AND S.col6 IS NULL) 
      OR D.col6 <> S.col6 
   OR (D.col7 IS NULL AND S.col7 IS NOT NULL) 
      OR (D.col7 IS NOT NULL AND S.col7 IS NULL) 
      OR D.col7 <> S.col7 
   OR (D.col8 IS NULL AND S.col8 IS NOT NULL) 
      OR (D.col8 IS NOT NULL AND S.col8 IS NULL) 
      OR D.col8 <> S.col8 
)
MERGE DestinationTable AS D
将SourceTable用作D.Alternate_ID=S.ID上的S
当匹配和
(
ISNULL(D.ID.))ISNULL(S.ID.))
或ISNULL(D.col1'')ISNULL(S.col1'')
或者ISNULL(D.col2',)ISNULL(S.col2',)
或者ISNULL(D.col3',)ISNULL(S.col3',)
或者ISNULL(D.col4'')ISNULL(S.col4'')
或者ISNULL(D.col5',)ISNULL(S.col5',)
或者ISNULL(D.col6'')ISNULL(S.col6'')
或者ISNULL(D.col7'')ISNULL(S.col7'')
或者ISNULL(D.col8',)ISNULL(S.col8',)
)
D.ID
S.ID
D.colx
S.colx
也可以是
Null
处理
Null
的方式。(即
NULL=NULL

按您想要的方式处理
NULL
。(即
NULL=NULL


您可以通过以下方式简化操作:

MERGE DestinationTable AS D
将SourceTable用作
在D.Alternate_ID=S.ID上
当匹配和
二进制校验和(d.col1,d.col2,…,d.col8)二进制校验和(s.col1,…,s.col8)

出现误报的碰撞概率很小(值确实发生了变化,但校验和是相同的),但可以忽略不计。

您可以通过以下方式简化:

MERGE DestinationTable AS D
将SourceTable用作
在D.Alternate_ID=S.ID上
当妈妈
...
WHEN MATCHED 
     AND EXISTS (SELECT D.Col1, D.Col2, ...
                 EXCEPT S.Col1, S.Col2, ...)
MERGE  DestinationTable AS D 
USING  SourceTable AS S
ON D.Alternate_ID = S.ID
WHEN MATCHED AND 
 BINARY_CHECKSUM(d.col1, d.col2, ...,d.col8) <> BINARY_CHECKSUM(s.col1, ..., s.col8)