NULL的陷阱:Merge

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280347.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280347.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280347.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python實現將不規范的英文名字首字母大寫

Python實現將不規范的英文名字首字母大寫 這篇文章給大家主要介紹的是利用map()函數&#xff0c;把用戶輸入的不規范的英文名字&#xff0c;變為首字母大寫&#xff0c;其他小寫的規范名字。文中給出了三種解決方法&#xff0c;大家可以根據需要選擇使用&#xff0c;感興趣的朋…

使用 System.Text.Json 時,如何處理 Dictionary 中 Key 為自定義類型的問題

在使用 System.Text.Json 進行 JSON 序列化和反序列化操作時&#xff0c;我們會遇到一個問題&#xff1a;如何處理字典中的 Key 為自定義類型的問題。背景說明 例如&#xff0c;我們有如下代碼&#xff1a;// 定義一個自定義類型 public class CustomType {public int Id { get…

極限編程 (Extreme Programming) - 發布計劃 (Release Planning)

編寫用戶故事后&#xff0c;您可以使用發布計劃會議來創建發布計劃。發布計劃指定 將為每個系統版本實現哪些用戶故事以及這些版本的日期。這給出了一組用戶故事供客戶在迭代計劃會議期間進行選擇&#xff0c;以便在下一次迭代期間實施。然后將這些選定的故事翻譯成單獨的編程任…

使用Ubuntu的公用文件夾輕松地在計算機之間共享文件

You’ve probably noticed that Ubuntu comes with a Public folder in your home directory. This folder isn’t shared by default, but you can easily set up several different types of file-sharing to easily share files on your local network. 您可能已經注意到&am…

NSA泄露的惡意軟件DoublePulsar感染了數萬臺Windows電腦

本文講的是NSA泄露的惡意軟件DoublePulsar感染了數萬臺Windows電腦&#xff0c;安全研究人員認為&#xff0c;世界各地的腳本小子和在線犯罪分子正在利用Shadow Brokers 黑客組織上周泄露的NSA黑客工具&#xff0c;致使全球數十萬臺Windows計算機正面臨網絡攻擊威脅。 上周&…

Nginx、LVS及HAProxy負載均衡軟件的優缺點詳解

轉自&#xff1a;https://www.csdn.net/article/2014-07-24/2820837 摘要&#xff1a;Nginx/LVS/HAProxy是目前使用最廣泛的三種負載均衡軟件&#xff0c;一般對負載均衡的使用是隨著網站規模的提升根據不同的階段來使用不同的技術&#xff0c;具體的應用需求還得具體分析&…

windows下使用nginx調試簡介

安裝使用 nginx是一個反向代理服務器&#xff0c;在web開發調試中經常用到&#xff0c;寫一個簡單的使用說明和總結。 1. 下載 點擊官網下載地址 下載對應版本的nginx并解壓 2. 配置 在解壓的目錄下找到conf/nginx.conf文件添加所需監聽和代理的server # 項目名稱server {liste…

MASA Framework 命令查詢職責分離

概念CQRS (https://learn.microsoft.com/zh-cn/azure/architecture/patterns/cqrs)是一種與領域驅動設計和事件溯源相關的架構模式, 它的全稱是Command Query Responsibility Segregation, 又叫命令查詢職責分離, Greg Young在2010年創造了這個術語, 它是基于Bertrand Meyer 的…

Google的Project Stream準備在Chrome中播放AAA控制臺游戲

Streaming full 3D games over a high-speed web connection is a fast growing trend. And with ridiculous amounts of infrastructure and remote computing power, Google is well equipped to join it. 通過高速網絡連接流式傳輸完整的3D游戲是一種快速增長的趨勢。 憑借可…

私有云之迷思:未來是什么?

本文講的是私有云之迷思&#xff1a;未來是什么&#xff1f;&#xff0c;【編者的話】非常好的一篇文章&#xff0c;作者從OpenStack目前的困境講起&#xff0c;聊到了私有云的產生背景&#xff0c;進而介紹了云計算的發展史。從云計算誕生的初衷以及現在流行的分布式應用又延伸…

如何在vue中使用sass

安裝sass 安裝教程鏈接&#xff1a; https://www.sass.hk/install/ 在vue中使用sass 參考鏈接&#xff1a; https://www.jianshu.com/p/8e60048baeb7 打開控制臺&#xff1a;輸入命令行 如果是沒有淘寶鏡像的&#xff0c;先下載淘寶鏡像&#xff0c;之后的下載速度比較快 npm i…

maven項目的目錄結構

1、maven項目采用“約定優于配置”的原則&#xff1a; src/main/java&#xff1a;約定用于存放源代碼&#xff0c;src/test/java&#xff1a;用于存放單元測試代碼&#xff0c;&#xff08;測試代碼的包應該和被測試代碼包結構保持一致&#xff0c;方便測試查找&#xff09;src…

AWS大力支持.NET 開源項目,和Azure搶.NET 客戶

出品 | OSC開源社區&#xff08;ID&#xff1a;oschina2013)在 2022 re:Invent 會議上&#xff0c; AWS 軟件開發經理 Saikat Banerjee 銳評道&#xff1a;” 我們發現 .NET 開源項目資金嚴重不足&#xff0c;仍可稱之為第三方開源”。隨即表示 AWS 過去非常重視 .net 生態&…

攻防 logmein_如何使用LogMeIn Hamachi在任何地方訪問文件

攻防 logmeinWhether you’re at work and forgot some file on your home computer, want to play some music on a train, or just want to move some files between your computers, accessing your files from anywhere is a life saver. 無論您是在工作時忘記了家用計算機…

Docker-machine創建虛機時停在虛機啟動的提示上,并且創建的虛機顯示Ip Not found...

Docker-machine創建虛機時停在虛機啟動的提示上&#xff0c;并且創建的虛機用docker-machine ls 列出來的時候顯示Ip Not found&#xff0c; 是什么原因那&#xff1f; 【答案】 看這個帖子&#xff1a; https://github.com/docker/machine/issues/3832 拷貝如下&#xff1a; I…

【年度總結】2016年年度總結

早晨醒來&#xff0c;在被窩里面刷著簡書&#xff0c;看到一篇文章叫《深漂一年&#xff0c;一個資深程序員的2016年終告白》&#xff0c;寫的很好&#xff0c;很有感觸。在2016年的農歷的最后一天&#xff0c;總是有很多感觸要寫下來。所以下午掃墓之后&#xff0c;我也按照劇…

在FC中如何獲取fcdot文件

在FlexiCapture中一些客戶在問如何獲取.fcdot文件(在測試序列號下或者沒有測試模板的情況下) 第一步&#xff1a; 1、查看License Manager查看是否找到序列號 首先我們在開始菜單里面打開ABByyFlexiCapTure11——》選擇"工具"下的License Manager 第二步 1、選擇管理…

Blazor學習之旅 (9) 用MudBlazor重構Todo

【Blazor】| 總結/Edison Zhou大家好&#xff0c;我是Edison。在之前的學習之旅&#xff08;3&#xff09;開發一個Todo應用中&#xff0c;我們開發了一個簡單版的Todo&#xff0c;這次我們基于MudBlazor來重構這個Todo應用。Todo V1回顧在Blazor入門學習&#xff08;3&#xf…

50多種在Photoshop中刪除圖像背景的工具和技術,第3頁

We’re completing the 50 Tools and Techniques today with this final installment. Read about advanced selection and masking tools, as well as some stupid graphics geek tricks, and ways to fake removing a background in seconds. 我們今天最后一部分將完成50多種…

socket跟TCP/IP 的關系,單臺服務器上的并發TCP連接數可以有多少

常識一&#xff1a;文件句柄限制 在linux下編寫網絡服務器程序的朋友肯定都知道每一個tcp連接都要占一個文件描述符&#xff0c;一旦這個文件描述符使用完了&#xff0c;新的連接到來返回給我們的錯誤是“Socket/File:Cantopen so many files”。 這時你需要明白操作系統對可以…