NULL表示unknown,不确定值,所以任何值(包括null值)和NULL值比较都是不可知的,在on子句,where子句,Merge或case的when子句中,任何值和null比较的结果都是false,这就是NULL设下的陷阱,我被坑过。

有一次,我使用Merge同步数据,由于target表中存在null值,虽然在source表中对null值做过处理,但是忽略了target表中的null值,导致数据merge失败。

step1,创建示例数据

--create source table
create table dbo.dt_source
(
id int null,
code int null
)
on [primary]
with(data_compression=page)--create target table
create table dbo.dt_target
(
id int null,
code int null
)
on [primary]
with(data_compression=page)

step2,插入示例数据

示例数据中,Source表和Target表中都存在null值,不管是在Source表,还是在Target表,都要避免和null值进行比较。

--insert data into table
insert into dbo.dt_source(id,code)
values(1,1),(2,2),(3,null)insert into dbo.dt_target(id,code)
values(1,1),(2,null)

step3,错误写法:只处理Source表中的null,而忽略Target表中的null

-- -1 stand for unknwon value
merge dbo.dt_target t
using dbo.dt_source son t.id=s.id
when matched and( t.code<>isnull(s.code,-1))then updateset t.code=s.code
when not matchedthen insert(id,code)values(s.id,s.code);

查看Target和Srouce表中的数据,数据不同步,不同步的原因是when matched子句之后的and 条件, t.code中存在null值,null值和任何值(包括null值)比较的结果都是unknown,在when子句中视为false。

正确写法1,不管是在target表,还是在source表,只要存在null值,必须进行处理,避免出现和null进行比较的情况。

处理的方式是使用一个值来表示unknwon,如果ID列有效值不可能是负值,那么可以使用-1来代替unknown。因为-1和-1 是相等的,逻辑上就将null值和null值视为相同。

-- -1 stand for unknwon value
merge dbo.dt_target t
using dbo.dt_source son t.id=s.id
when matched and( isnull(t.code,-1)<>isnull(s.code,-1))then updateset t.code=s.code
when not matchedthen insert(id,code)values(s.id,s.code);

正确写法2,在条件子句中,使用is null或 is not null来处理null值。

Tsql 使用is null和is not null来确实是,不是 null。 null is null 的逻辑值是true,other_value is null 为false, other_value is not null 为true。

merge dbo.dt_target t
using dbo.dt_source son t.id=s.id
when matched and( t.code<>s.code or t.code is null or s.code is null)then updateset t.code=s.code
when not matchedthen insert(id,code)values(s.id,s.code);

转载于:https://www.cnblogs.com/wangsicongde/p/7551284.html

NULL的陷阱:Merge相关推荐

  1. Java自动装箱与拆箱及其陷阱

    2019独角兽企业重金招聘Python工程师标准>>> 在本文中,笔者向大家介绍下Java中一个非常重要也非常有趣的特性,就是自动装箱与拆箱,并从源码中解读自动装箱与拆箱的原理,同时 ...

  2. oracle null的解析

    有人总结了数据库中Null值的概念,比较精炼,摘录如下: Null是数据库中特有的数据类型,当一条记录的某个列为Null,则表示这个列的值是未知的.是不确定的.既然是未知的,就有无数种的可能性.因此, ...

  3. Java中list==null与list.size( )==0的区别

    在此特别说明一下list!=null和list.size()>0的区别: 1.list==null,意味着list压根没有地址,在堆内就不存在. 2.list.size()=0 意思堆内有lis ...

  4. while读取文件 Shell中while循环的陷阱, 变量实效, 无法赋值变量

    在写while循环的时候,发现了一个问题,在while循环内部对变量赋值.定义变量.数组定义等等环境,在循环外面失效. 一个简单的测试脚本如下: #!/bin/bash echo "abc ...

  5. javascript 手势缩放 旋转 拖动支持:hammer.js

    原文: https://cdn.rawgit.com/hammerjs/hammer.js/master/tests/manual/visual.html /*! Hammer.JS - v2.0.4 ...

  6. Leetcode: Sort List

    Sort a linked list in O(n log n) time using constant space complexity. 记得Insert Sort List, 那个复杂度是O(N ...

  7. 《编写可维护的JavaScript》——1.7 直接量

    本节书摘来自异步社区<编写可维护的JavaScript>一书中的第1章,第1.7节,作者: [美]Nicholas C. Zakas 译者: 李晶 , 郭凯 , 张散集 更多章节内容可以访 ...

  8. java layoutinflater_LayoutInflater(布局服务)

    本节引言: 本节继续带来的是Android系统服务中的LayoutInflater(布局服务),说到布局,大家第一时间 可能想起的是写完一个布局的xml,然后调用Activity的setContent ...

  9. javascript 检测 header下载文件--插件

    原理:下载文件时设置一个cookie,客户端利用js间隔性检测cookie,如果检测到则服务端对下载的文件处理完毕,然后通知客户端 http://johnculviner.com/post/2012/ ...

最新文章

  1. iOS 解决app退出后台应用重新启动的问题
  2. 微软WSUS服务器 3.0安装配置详解
  3. OpenCV DIS光流OpticalFlow的实例(附完整代码
  4. 最新 Linux安装项目环境 mysql 完整教程 100%可行.附带所有教程
  5. 前端学习(2310):数据请求和json-server
  6. Google C++ Testing Framework之断言
  7. poj 1273 最大流
  8. python中的进程池:multiprocessing.Pool()
  9. 如何解决”ArcGIS Server Site is currently being configured by another administrative operation“的问题
  10. 54 字符流中第一个不重复的字符
  11. 系统设计与任务分配(团队作业)
  12. cannot import name 'StrictRedis' from 'redis'
  13. 北风设计模式课程---代理模式
  14. Python-图像-伪彩色图像处理
  15. 关于target is null for setProperty的问题总结
  16. 移动计算为王——我眼中的下一代计算机产业
  17. linux usb 存储设备,找到哪个驱动器对应于Linux中的哪个USB大容量存储设备
  18. 【银行】银行业务系统设计特点概述
  19. c语言long类型转换成string,如何在C ++中将long转换为string?
  20. Promise(一)介绍、fs读取文件、AJAX请求

热门文章

  1. iOS开发tableview二级联动的细节实现中注意的细节总结
  2. NSPredicate的用法、数组去重、比较...
  3. Android 实现切换主题皮肤功能(类似于众多app中的 夜间模式,主题包等)
  4. css3高级和低级样式属性先后顺序
  5. 撰写论文时word使用技巧(转)
  6. 固定资产打开提示:上年度数据未结转!
  7. 世界领先的界面设计公司:The Skins Factory
  8. 服务器端密钥库文件,使用密钥库文件为SOAP运行客户端WS
  9. uniapp背景图片android不显示,uni-app网络图片在app不显示,小程序显示
  10. python 钉钉机器人发送图片_Python结合钉钉实时自动监控股票行情,上班炒股再也不怕老板发现...