做爰高潮a片〈毛片〉,尤物av天堂一区二区在线观看,一本久久A久久精品VR综合,添女人荫蒂全部过程av

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

SQL點滴18—SqlServer中的merge操作,相當地風騷

來源:懂視網 責編:小采 時間:2020-11-09 15:34:17
文檔

SQL點滴18—SqlServer中的merge操作,相當地風騷

SQL點滴18—SqlServer中的merge操作,相當地風騷:今天在一個存儲過程中看見了merge這個關鍵字,第一個想法是,這個是配置管理中的概念嗎,把相鄰兩次的更改合并到一起。后來在technet上搜索發現別有洞天,原來是另外一個sql關鍵字,t-sql的語法還是相當地豐富的。本篇是一篇學習筆記,沒有什么新意,這里給
推薦度:
導讀SQL點滴18—SqlServer中的merge操作,相當地風騷:今天在一個存儲過程中看見了merge這個關鍵字,第一個想法是,這個是配置管理中的概念嗎,把相鄰兩次的更改合并到一起。后來在technet上搜索發現別有洞天,原來是另外一個sql關鍵字,t-sql的語法還是相當地豐富的。本篇是一篇學習筆記,沒有什么新意,這里給

今天在一個存儲過程中看見了merge這個關鍵字,第一個想法是,這個是配置管理中的概念嗎,把相鄰兩次的更改合并到一起。后來在technet上搜索發現別有洞天,原來是另外一個sql關鍵字,t-sql的語法還是相當地豐富的。本篇是一篇學習筆記,沒有什么新意,這里給

今天在一個存儲過程中看見了merge這個關鍵字,第一個想法是,這個是配置管理中的概念嗎,把相鄰兩次的更改合并到一起。后來在technet上搜索發現別有洞天,原來是另外一個sql關鍵字,t-sql的語法還是相當地豐富的。本篇是一篇學習筆記,沒有什么新意,這里給出technet上的地址連接供大家參考權威:http://technet.microsoft.com/zh-cn/library/bb510625.aspx,這里具體的語法不去深究了,只是把幾個例子實際運行,剖析一番。

  

使用merge同時執行insert和update操作

我們經常會有這樣的需求,根據某個字段或多個字段查找表中的一行或多行數據,如果查找成功得到匹配項,更新其中的其他一個或多個字段;如果查找失敗則將“某個字段或多個字段”作為新的一行中的數據插入到表中。第一種方法是先更新,然后根據@@rowcount判斷是否有匹配項,如果沒有則插入。先使用下面的 代碼創建一個存儲過程。

1 use AdventureWorks
2 go
3 createprocedure dbo.InsertUnitMeasure @UnitMeasureCodenchar(3),@Namenvarchar(25)
4 as
5 begin
6 set nocount on;
7 update Production.UnitMeasure set Name=@Namewhere UnitMeasureCode=@UnitMeasureCode
8 if(@@ROWCOUNT=0)
9 begin
10 insertinto Production.UnitMeasure(Name,UnitMeasureCode)values(@Name,@UnitMeasureCode)
11 end
12 end
13 go

記得見過這樣的筆試題目,要求是插入不存在的行,只要把上面語句中的update改成select就可以了,當時沒有寫出來,現在恍然大悟,也許是在考察@@ROWCOUNT的用法吧。這個語句也可以使用merge語句實現。下面我們使用merge關鍵字來修改這個存儲過程。

1 alterprocedure dbo.InsertUnitMeasure @UnitMeasureCodenchar(3),@Namenvarchar(25)
2 as
3 begin
4 set nocount on
5 merge Production.UnitMeasure as target
6 using (select@UnitMeasureCode,@Name) as source (UnitMeasureCode,Name)
7 on (target.UnitMeasureCode=source.UnitMeasureCode)
8 when matched thenupdateset Name=source.Name
9 whennot matched theninsert(UnitMeasureCode,Name)values(source.UnitMeasureCode,Name)
10 output deleted.*,$action,inserted.*into MyTempTable;
11 end
12 go

這個語句使用merge修改存儲過程,這個語句中又出現我不太了解的關鍵字using和$action。Using是用來指定和表InsertUnitMeasure中相匹配的數據源,這里的數據源來自外部輸入,是通過兩個輸入參數得到。$action可能是一個占位符,表示上面的when字句進行的操作。至于inserted.*和deleted.* 就是插入和刪除的數據行了,這個我在其中一篇文章中也提到,他們有點類似類中的this關鍵字,過可以看看:SQL點滴14—編輯數據。注意為了記錄修改的過程我們需要創建一個臨時表#MyTempTable來跟蹤修改過程,所以在調用這個存儲過程之前我們需要新建這個表,語句如下:

1 createtable MyTempTable(
2 ExistingCode nchar(3),
3 ExistingName nvarchar(50),
4 ExistingDate datetime,
5 ActionTaken nvarchar(50),
6 NewCode nchar(3),
7 [NewName]nvarchar(50),
8 NewDate datetime
9 )
10 Go

現在我們來執行下面的語句看看有什么樣的結果:

1 exec InsertUnitMeasure @UnitMeasureCode='ABC',@Name='New Test Value1'
2 EXEC InsertUnitMeasure @UnitMeasureCode='XYZ', @Name='Test Value';
3 EXEC InsertUnitMeasure @UnitMeasureCode='ABC', @Name='Another Test Valuea';
4 Go

首先使用語句:select * from Production.UnitMeasure order by ModifiedDate desc 來查看目標表中的數據變化如圖1:

圖1

這里雖然三次執行了存儲過程,但是由于第一次和第三次的@UnitMeasureCode的值是相同的’ABC’所以第二次肯定是進行更新操作。所以最后表中新增了兩條記錄。然后使用下面的語句查看記錄表MyTempTable中的跟蹤信息如圖2

圖2

我們可以看到前面兩條語句執行的是插入操作,所以原有的值都是空,因為在插入之前他們還不存在。第三條新型的是更新操作,更新UnitMeasureCode為’ABC’的記錄。

  

使用merge在單個語句中執行insert和update操作

在AdventureWorks數據庫中有ProductInventory表,存儲的是存貨信息,SalesOrderDetail表中存儲的是訂單信息,現在如果每天減去對SalesOrderDetail表中每種產品所下的訂單數,更新ProductInventory表中的 Quantity列。如果隨著時間推移訂單數導致產品庫存量下降到0或者更少,則從ProductInventory表中刪除該產品對應的行。下面的語句創建一個存儲過程實現上面的邏輯。

1 CREATEPROCEDURE Production.usp_UpdateInventory
2 @OrderDatedatetime
3 AS
4 MERGE Production.ProductInventory AS target
5 USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod
6 JOIN Sales.SalesOrderHeader AS soh
7 ON sod.SalesOrderID = soh.SalesOrderID
8 AND soh.OrderDate =@OrderDate
9 GROUPBY ProductID) AS source (ProductID, OrderQty)
10 ON (target.ProductID = source.ProductID)
11 WHEN MATCHED AND target.Quantity - source.OrderQty <=0
12 THENDELETE
13 WHEN MATCHED
14 THENUPDATESET target.Quantity = target.Quantity - source.OrderQty,
15 target.ModifiedDate =GETDATE()
16 OUTPUT $action, Inserted.ProductID, Inserted.Quantity, Inserted.ModifiedDate, Deleted.ProductID,
17 Deleted.Quantity, Deleted.ModifiedDate;
18 GO

這個語句比第一個要復雜一點,注意當匹配成功并且總量小于0的時候直接使用一個delete就可以將此條記錄刪除,output語句直接把操作結果輸出,相當地神奇。最后運行下面的 語句得到如圖3的結果。注意這個語句相當于將2003年5月1號的訂單量減去。如果多次運行的話就相當于多減了一次,整個表中數據條數會減少的。

EXECUTE Production.usp_UpdateInventory '20030501'

圖3

  

借助派生源表,使用merge對目標表執行update和insert操作

這次我們已知有一些表數據,我們要和Sales.SalesReason這個表中的數據做對比,如果和SalesReason表中的Name字段匹配時就更新表中的ReasonType列,如果沒有匹配項的時候就插入這一行新的數據。在這里是使用表值構造函數指定源表的多個行,使用表變量存儲更新記錄,注意表變量的使用范圍。代碼如下:

1 declare@SummaryOfChangestable(Change varchar(20))
2 merge into Sales.SalesReason as target
3 using(values('Recommendation','Other'),('Review','Marketing'),('Internet','Promotion')) as source([NewName],NewReasonType)
4 on target.Name=source.[NewName]
5 when matched thenupdateset ReasonType=source.NewReasonType
6 whennot matched by target theninsert(Name,ReasonType) values ([NewName],NewReasonType)
7 output $action into@SummaryOfChanges;
8 select Change,COUNT(*) as CountPerChange from@SummaryOfChangesgroupby Change

執行完上面的語句之后我們得到下面的結果說明執行了2次插入,1次更新,如圖4。那么是不是這樣的 呢,我們查看Sales.SalesReason這個表發現原來已經有’Review’這一條數據了,對它執行了更新,剩下的’Recommendation’,’Internet’執行的是插入操作。如果再次執行上面的語句就會得到UPDATE 3這樣的結果,因為已經存在這三條數據了所以都執行UPDATE。

圖4

  

將merge執行的結果插入到另外一個表中

我們還可以將merge操作得到的結果寫入到另外一個表中,如下的語句將更新的每條數據信息寫入到一個新建的表Production.UpdatedInventory中,代碼如下:

1 INSERTINTO Production.UpdatedInventory
2 SELECT ProductID, LocationID, NewQty, PreviousQty
3 FROM
4 ( MERGE Production.ProductInventory AS target
5 USING (SELECT ProductID, SUM(OrderQty)
6 FROM Sales.SalesOrderDetail AS sod
7 JOIN Sales.SalesOrderHeader AS soh
8 ON sod.SalesOrderID = soh.SalesOrderID
9 AND soh.OrderDate BETWEEN'20030701'AND'20030731'
10 GROUPBY ProductID) AS source (ProductID, OrderQty)
11 ON target.ProductID = source.ProductID
12 WHEN MATCHED AND target.Quantity - source.OrderQty >=0
13 THENUPDATESET target.Quantity = target.Quantity - source.OrderQty
14 WHEN MATCHED AND target.Quantity - source.OrderQty <=0
15 THENDELETE
16 OUTPUT $action, Inserted.ProductID, Inserted.LocationID, Inserted.Quantity AS NewQty, Deleted.Quantity AS PreviousQty)
17 AS Changes (Action, ProductID, LocationID, NewQty, PreviousQty) WHERE Action ='UPDATE';
18 GO

執行這個語句再查詢表得到如下圖5的結果,我們可以看到新的銷售量總是比以前的銷售量要少,因為執行一次就要減去訂單量。

圖5

這里我們只記錄了更新的變化,如果想記錄所有的操作可以去掉最后的一個限制條件WHERE Action = 'UPDATE',那就要修改記錄表的結構了,這個和第二個例子有些相似,只不過將記錄在實際的表中,而第二個例子僅僅輸出這些操作記錄。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

SQL點滴18—SqlServer中的merge操作,相當地風騷

SQL點滴18—SqlServer中的merge操作,相當地風騷:今天在一個存儲過程中看見了merge這個關鍵字,第一個想法是,這個是配置管理中的概念嗎,把相鄰兩次的更改合并到一起。后來在technet上搜索發現別有洞天,原來是另外一個sql關鍵字,t-sql的語法還是相當地豐富的。本篇是一篇學習筆記,沒有什么新意,這里給
推薦度:
標簽: 操作 中的 點滴
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 永仁县| 正镶白旗| 廉江市| 邢台市| 章丘市| 克什克腾旗| 镇平县| 弥渡县| 海口市| 彭州市| 贞丰县| 东方市| 宿迁市| 固安县| 塔城市| 始兴县| 宜州市| 远安县| 即墨市| 克拉玛依市| 榆树市| 泾阳县| 娄底市| 分宜县| 上高县| 台东市| 双柏县| 根河市| 师宗县| 商河县| 察隅县| 章丘市| 比如县| 鲁山县| 嫩江县| 马龙县| 寿阳县| 大埔县| 无锡市| 龙里县| 黎平县|