0%

【SQL】Output

/images/20190507/0.jpg

情境

DBA 反應偵測到有個 Update Query 很頻繁,且通常緊接著 Update 後都會再進 Select 把剛剛 Update 的資料拉走,資料量太大時頻率太高導致 SQL 效能瓶頸,建議調整成 Update 後直接把剛剛異動的資料拉走,而不是拆兩段查詢。

解決方案

當 SQL Server 執行 Update 時會 Lock 相關要異動的資料,並把異動前後的資料放入 Log 中,如果希望能在一次 Query 中就把資料 Update 並把影響到的資料回傳,可以透過 Ouput 這個子句來達成

Ouput 可用於以下情境

Delete

Insert

Update

Merge

我們有一張表,紀載著每個人的名稱與學期分數

/images/20190507/1.png

老師大發慈悲想把低於 60 分的人都改成 60 分及格,這時候語法可以這樣下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DECLARE @UpdateLog table(
Id int not null,
Name nvarchar(20) not null,
OriScore int not null,
NewScore int not null
)

UPDATE dbo.[User]
SET Score = 60
OUTPUT INSERTED.Id,
INSERTED.Name,
DELETED.Score,
INSERTED.Score
INTO @UpdateLog
WHERE Score < 60

SELECT * FROM @UpdateLog

/images/20190507/2.png