說一下output子句

来源:http://www.cnblogs.com/Gin-23333/archive/2016/01/29/5169321.html
-Advertisement-
Play Games

Output子句日常灰常有用,而且用的地方也挺多,但是確好多時候被我們忽視,今天我就也簡單掃盲一下這個語句的用法。 Output子句 返回受 INSERT、UPDATE、DELETE 或 MERGE 語句影響的各行中的信息,或返回基於受這些語句影響的各行的表達式。 這些結果可以返回到處理應用程式,以


Output子句日常灰常有用,而且用的地方也挺多,但是確好多時候被我們忽視,今天我就也簡單掃盲一下這個語句的用法。

Output子句

返回受 INSERT、UPDATE、DELETE 或 MERGE 語句影響的各行中的信息,或返回基於受這些語句影響的各行的表達式。 這些結果可以返回到處理應用程式,以供在確認消息、存檔以及其他類似的應用程式要求中使用。 也可以將這些結果插入表或表變數。 另外,您可以捕獲嵌入的 INSERT、UPDATE、DELETE 或 MERGE 語句中 OUTPUT 子句的結果,然後將這些結果插入目標表或視圖(視圖並不能直接插入的,等下我說)。

下麵做下這4種類型的output 用法

先搞個測試表

CREATE TABLE [dbo].[AAA1]
(
[ID] [int] PRIMARY KEY,
[Col2] VARCHAR(100)
) ON [PRIMARY]
GO



CREATE TABLE [dbo].[AAA2]
(
[ID] [int] PRIMARY KEY,
[Col2] VARCHAR(100)
) ON [PRIMARY]
GO

1、 insert 

INSERT INTO dbo.AAA1
        ( ID, Col2 )
OUTPUT Inserted.ID,Inserted.Col2 INTO AAA2(ID,Col2)
VALUES  ( 4,'1' )

這樣就可以在插入AAA1 的同時將插入的結果輸出插入到 AAA2 裡面。

我想到有2個常用的場景

1、有些功能想要寫入記錄的時候也同時插入一個記錄表來記錄操作,很多時候會想起觸發器。如果只是如此單純的操作,那麼真還不如使用一句output來得實惠了。但是這個也看具體場景,不扯太遠。

2、當我們單條插入的時候,要捕獲ID的話還可以使用  SCOPE_IDENTITY() 來獲取,但是如果批量的時候,要獲取插入的自增列對應的列,就可以使用OutPut 來捕獲了~

 

2、update 

UPDATE AAA1 SET col2 = 'BB'
    OUTPUT Deleted.ID,Deleted.Col2,Inserted.ID,Inserted.Col2
    WHERE ID = 1

在update 裡面呢,就會存在有 Deleted 和 inserted 2個臨時表,這個就類似於 觸發器裡面的 deleted表和 inserted 表了。可以捕捉到更新前後的值

 

3、deleted 

DELETE FROM dbo.AAA1
    OUTPUT Deleted.ID,Deleted.Col2
    WHERE ID = 1

delete 也就是差不多,語法是一樣的。

 

4、 Merge 

MERGE dbo.AAA1 AS TAR
USING (SELECT 1,'a'
) AS SOUR(ID,Col2)
ON 1 = 0
WHEN NOT MATCHED THEN INSERT (ID,Col2) VALUES (SOUR.ID,SOUR.Col2)
OUTPUT $action,Deleted.*,Inserted.*;

Merge就有一個獨特一點的 $Action 的東東,這個的值會表示它的行動,有 'INSERT','UPDATE','DELETE' 3種動作。對於要捕捉在Merge裡面的變化就很好用啦~

Merge還有一點比較好用,可以把沒有插入到目標的列,也帶到Output裡面來~這個就可以清晰的看到每一行數據的對應情況了

 

但是Output雖好,但是還是會有一些限制,有些我遇到過,有些還沒測試過。(以下內容出自聯機文檔)

  • 整個操作是原子的。 INSERT 語句和包含 OUTPUT 子句的嵌套 DML 語句要麼都執行,要麼整個語句都失敗。

  • 以下限制適用於外層 INSERT 語句的目標:

    • 目標不能為遠程表、視圖或公用表表達式。 (這個好理解,這個是指insert 的對象,並非指 output into 的對象)

    • 目標不能有 FOREIGN KEY 約束,或者被 FOREIGN KEY 約束所引用。 (就是output into 的目標表不能帶外鍵)

    • 不能對目標定義觸發器。

    • 目標不能參與合併複製或事務複製的可更新訂閱。

  • 對於嵌套的 DML 語句有以下限制:

    • 目標不能為遠程表或分區視圖。

    • 源本身不能包含 <dml_table_source> 子句。

  • 在包含 <dml_table_source> 子句的 INSERT 語句中不支持 OUTPUT INTO 子句。

  • @@ROWCOUNT 返回僅由外層 INSERT 語句插入的行。

  • @@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 僅返回由嵌套的 DML 語句生成的標識值,而不返回由外層 INSERT 語句生成的標識值。

  • 查詢通知將語句作為單個實體進行處理,並且即使重大更改是來自外層 INSERT 語句本身,所創建的任何消息的類型也將是嵌套 DML 的類型。

  • 在 <dml_table_source> 子句中,SELECT 和 WHERE 子句不能包括子查詢、聚合函數、排名函數、全文謂詞、執行數據訪問的用戶定義函數或是 TEXTPTR 函數。

 

其它東西~遇到了在繼續補充

 

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前人經驗: 開源控制項:一個自定義的帶數字progress類:NumberProgressBar; WebViewClient就是幫助WebView處理各種通知、請求事件的。 WebChromeClient是輔助WebView處理Javascript的對話框,網站圖標,網站title,載入進度等 。
  • 引言 最近半年一直在學習JavaWeb,落下了iOS。如下寒假來臨,自己又有時間進一步學習iOS了。並且伴隨了在寒假準備搞定一個項目,工作之餘開始自己有意識的要提高,決定深入研究一下”網路”這一塊。 NSURLSession 自己開始寫的時候發現最基本的網路的請求不能用了,開始尋求答案。 如下:這是
  • 之前項目需求要實現一個鬧鐘,github上找了半天發現都是很舊的代碼了,所以就準備自己寫一個,剛好最近在學習Swift,就用Swift寫了一個demo放在這裡:https://github.com/Phelthas/Demo_AlarmClock 效果如圖: 總結一下,備忘 界面的話一個DatePi
  • Redis 的複製 (replication) 是一種使用和配置起來非常簡單的主從(master-slave)複製,允許 Redis 從伺服器成為主伺服器的精確副本。以下是關於 Redis 複製的一些重要方面: Redis 採用非同步複製。從 Redis 2.8 開始,從伺服器會周期性地報告從複製流中
  • 解決:Host xxx.xxx.xxx.xxx is blocked because of many connection errors.
  • 1、假設備份文件xxxx.bak大小約300G,還原後所占用的空間為900G 2、磁碟空間只有1T,若將備份文件拷貝過來,空間剩餘700G,無法成功還原,因此通過遠程方式還原。 例子如下: SQLSERVER服務實例名稱: 192.168.12.163需要備份的資料庫名稱: a備份機器名稱(Clie
  • 配置文件內容:[root@yoon etc]# cat mongod.conf logpath=/export/log/mongodb.loglogappend=truefork = truedbpath=/export/data/dbpidfilepath = /export/mongodb/et
  • ===================================================================================================================#!/bin/sh. /etc/profile DATE=`date
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...