剛才看項目里一個存儲過程,也是好長時間沒有使用Sql Server2008了,好多寫法和函數感覺到陌生,這就遇到了CROSS APPLY 和MERGE的語法,兩者之前完全沒接觸過。 所以專門查了下SQL Server2008實戰。
1、CROSS APPLY從教程和數據查詢結果來看CROSS APPLY完全是屬于語法糖,下面是我基于AdventrueWorkR2查詢的,使用了CROSS APPLY和INNER JOIN兩種方式。
USE [AdventureWorks2008R2]GO/****** Object: UserDefinedFunction [dbo].[fn_WorkOrderRouting] Script Date: 08/13/2015 13:16:00 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER FUNCTION [dbo].[fn_WorkOrderRouting] (@WorkOrderID int) RETURNS TABLEASRETURN SELECT a.WorkOrderID,a.PRoductID,a.OperationSequence,a.LocationID FROM Production.WorkOrderRouting a WHERE a.WorkOrderID=@WorkOrderID
select w.WorkOrderID,w.OrderQty,r.ProductID,r.OperationSequence from Production.WorkOrder wCROSS APPLY dbo.fn_WorkOrderRouting(w.WorkOrderID) as rORDER BY w.WorkOrderID,w.OrderQty,r.ProductID
SELECT a.WorkOrderID,a.OrderQty,b.ProductID,b.OperationSequence FROM Production.WorkOrder a INNER JOIN Production.WorkOrderRouting b on a.WorkOrderID= b.WorkOrderIDORDER BY a.WorkOrderID,a.OrderQty,b.ProductID
2、MERGE
merge簡單來說是針對插入、更新、刪除三個操作的合并,根據與源表聯結的結果,對目標表進行插入、更新、刪除。 我們經常用的場景也就是主從表同步,或者是主表和歷史表的同步和維護。 下面代碼片段是我在網上看到的一段:
--創建一個臨時的訂單表CREATE TABLE Orders(OrderID INT,CustomerID NCHAR(5)) GO--往這個表中添加兩行記錄INSERT INTO Orders VALUES(1,N'AAAAA') INSERT INTO Orders VALUES(2,N'BBBBB') GO--通過生成表查詢,產生另外一個架構一模一樣的表,但只是復制了第一行數據過去SELECT * INTO Orders2 FROM Orders WHERE OrderID=1 GO--將第二個表的數據進行更新UPDATE orders2 SET CustomerID=N'DDDDD'--合并兩個表MERGE Orders o USING Orders2 o2 ON o2.OrderID=o.OrderID WHEN MATCHED THEN UPDATE SET O.CustomerID=o2.CustomerID--如果匹配到了,就更新掉目標表 WHEN NOT MATCHED THEN INSERT VALUES(o2.OrderID,o2.CustomerID)--如果匹配不到,就插入 WHEN NOT MATCHED BY SOURCE THEN DELETE;--如果來源表無法匹配到,就刪除
新聞熱點
疑難解答