日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

说一下output子句

發(fā)布時(shí)間:2023/11/29 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 说一下output子句 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

Output子句

返回受 INSERT、UPDATE、DELETE 或 MERGE 語句影響的各行中的信息,或返回基于受這些語句影響的各行的表達(dá)式。?這些結(jié)果可以返回到處理應(yīng)用程序,以供在確認(rèn)消息、存檔以及其他類似的應(yīng)用程序要求中使用。?也可以將這些結(jié)果插入表或表變量。?另外,您可以捕獲嵌入的 INSERT、UPDATE、DELETE 或 MERGE 語句中 OUTPUT 子句的結(jié)果,然后將這些結(jié)果插入目標(biāo)表或視圖(視圖并不能直接插入的,等下我說)。

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

先搞個(gè)測試表

CREATE TABLE [dbo].[AAA1] ( [ID] [int] PRIMARY KEY, [Col2] VARCHAR(100) ) ON [PRIMARY] GOCREATE 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 的同時(shí)將插入的結(jié)果輸出插入到 AAA2 里面。

我想到有2個(gè)常用的場景

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

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

?

2、update?

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

在update 里面呢,就會(huì)存在有 Deleted 和 inserted 2個(gè)臨時(shí)表,這個(gè)就類似于 觸發(fā)器里面的 deleted表和 inserted 表了。可以捕捉到更新前后的值

?

3、deleted?

DELETE FROM dbo.AAA1OUTPUT Deleted.ID,Deleted.Col2WHERE 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就有一個(gè)獨(dú)特一點(diǎn)的 $Action 的東東,這個(gè)的值會(huì)表示它的行動(dòng),有 'INSERT','UPDATE','DELETE' 3種動(dòng)作。對(duì)于要捕捉在Merge里面的變化就很好用啦~

Merge還有一點(diǎn)比較好用,可以把沒有插入到目標(biāo)的列,也帶到Output里面來~這個(gè)就可以清晰的看到每一行數(shù)據(jù)的對(duì)應(yīng)情況了

?

但是Output雖好,但是還是會(huì)有一些限制,有些我遇到過,有些還沒測試過。(以下內(nèi)容出自聯(lián)機(jī)文檔)

  • 整個(gè)操作是原子的。?INSERT 語句和包含 OUTPUT 子句的嵌套 DML 語句要么都執(zhí)行,要么整個(gè)語句都失敗。

  • 以下限制適用于外層 INSERT 語句的目標(biāo):

    • 目標(biāo)不能為遠(yuǎn)程表、視圖或公用表表達(dá)式。 (這個(gè)好理解,這個(gè)是指insert 的對(duì)象,并非指 output into 的對(duì)象)

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

    • 不能對(duì)目標(biāo)定義觸發(fā)器。

    • 目標(biāo)不能參與合并復(fù)制或事務(wù)復(fù)制的可更新訂閱。

  • 對(duì)于嵌套的 DML 語句有以下限制:

    • 目標(biāo)不能為遠(yuǎn)程表或分區(qū)視圖。

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

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

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

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

  • 查詢通知將語句作為單個(gè)實(shí)體進(jìn)行處理,并且即使重大更改是來自外層 INSERT 語句本身,所創(chuàng)建的任何消息的類型也將是嵌套 DML 的類型。

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

?

其它東西~遇到了在繼續(xù)補(bǔ)充

?

?

?

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/Gin-23333/p/5169321.html

總結(jié)

以上是生活随笔為你收集整理的说一下output子句的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。