久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

僅當表中不存在記錄時才插入記錄

Insert record only if record does not already exist in table(僅當表中不存在記錄時才插入記錄)
本文介紹了僅當表中不存在記錄時才插入記錄的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我想知道是否有一種方法可以在表中不包含該記錄的情況下將記錄插入到表中?

I'm wondering if there is a way to insert a record into a table only if the table does not already contain that record?

是否有可以執行此操作的查詢,或者我是否需要一個存儲過程?

Is there a query that will do this, or will I need a stored procedure?

推薦答案

你不說是什么版本的 SQL Server.如果 SQL Server 2008 你可以使用 MERGE

You don't say what version of SQL Server. If SQL Server 2008 you can use MERGE

注意:通常將 Merge 用于 Upsert,這是我最初認為問題所問的問題,但它在沒有 WHEN MATCHED 子句的情況下是有效的,只有一個 WHEN NOT MATCHED 子句也適用于這種情況.示例用法.

NB: It is usual to use Merge for an Upsert which is what I originally thought the question was asking but it is valid without the WHEN MATCHED clause and just with a WHEN NOT MATCHED clause so does work for this case also. Example Usage.

CREATE TABLE #A(
 [id] [int] NOT NULL PRIMARY KEY CLUSTERED,
 [C] [varchar](200) NOT NULL)


    MERGE #A AS target
    USING (SELECT 3, 'C') AS source (id, C)
    ON (target.id = source.id)
    /*Uncomment for Upsert Semantics
       WHEN MATCHED THEN 
        UPDATE SET C = source.C */
    WHEN NOT MATCHED THEN    
        INSERT (id, C)
        VALUES (source.id, source.C);

就執行成本而言,當要完成插入時,兩者看起來大致相等...

In terms of execution costs the two look roughly equal when an Insert is to be done...

首次運行計劃圖像的鏈接

但是在第二次運行時沒有插入操作時,馬修的答案看起來成本更低.我不確定是否有辦法改善這一點.

but on the second run when there is no insert to be done Matthew's answer looks lower cost. I'm not sure if there is a way of improving this.

鏈接以計劃第二次運行的圖像

測試腳本

select * 
into #testtable
from master.dbo.spt_values

CREATE UNIQUE CLUSTERED INDEX [ix] ON #testtable([type] ASC,[number] ASC,[name] ASC)


declare @name nvarchar(35)= 'zzz'
declare @number int = 50
declare @type nchar(3) = 'A'
declare @low int
declare @high int
declare @status int = 0;



MERGE #testtable AS target
USING (SELECT @name, @number, @type, @low, @high, @status) AS source (name, number, [type], low, high, [status])
ON (target.[type] = source.[type] AND target.[number] = source.[number] and target.[name] = source.[name] )
WHEN NOT MATCHED THEN    
INSERT (name, number, [type], low, high, [status])
VALUES (source.name, source.number, source.[type], source.low, source.high, source.[status]);

set @name = 'yyy'

IF NOT EXISTS 
    (SELECT *
    FROM #testtable
    WHERE [type] = @type AND [number] = @number and name = @name)
    BEGIN
INSERT INTO #testtable
(name, number, [type], low, high, [status])
VALUES (@name, @number, @type, @low, @high, @status);
END

這篇關于僅當表中不存在記錄時才插入記錄的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

SQL trigger on Truncate(截斷時的 SQL 觸發器)
sql search query with multiple optional search parameters(具有多個可選搜索參數的 sql 搜索查詢)
SQL Efficiency: WHERE IN Subquery vs. JOIN then GROUP(SQL 效率:WHERE IN 子查詢 vs. JOIN 然后 GROUP)
Retrieving XML element name using t-SQL(使用 t-SQL 檢索 XML 元素名稱)
Insert double quotes into SQL output(在 SQL 輸出中插入雙引號)
Delete rows from CTE in SQL SERVER(從 SQL SERVER 中的 CTE 中刪除行)
主站蜘蛛池模板: 正在播放国产精品 | 国产视频h | 成人性生交大免费 | 九九亚洲精品 | 91免费版在线观看 | 99re在线 | 成人在线免费视频观看 | 亚洲一区二区久久久 | 国产精品一区在线观看 | 日韩福利片| 黄色一级免费 | 在线免费黄色小视频 | 免费黄色的网站 | 日韩免费视频一区二区 | 人人亚洲 | 亚洲国产免费 | 国产亚洲欧美在线 | 成人在线精品视频 | 中文字幕在线一区 | 日韩成人在线观看 | 日韩有码在线观看 | 国产精品18hdxxxⅹ在线 | 欧美日韩福利视频 | 日韩欧美在线一区 | 在线观看av网站永久 | 国产精品99久久久久久动医院 | 91亚洲国产成人久久精品网站 | 中文字幕av亚洲精品一部二部 | 久久毛片| 国产91在线播放精品91 | 在线观看www视频 | 国产乱码精品一区二区三区忘忧草 | 日本精品视频在线观看 | 中文字幕一区二区三区四区不卡 | 超碰人人在线 | 亚洲成网| 国产国产精品 | 国产在线中文字幕 | 天堂一区二区三区 | 成人精品在线观看 | 亚洲国产日韩欧美 |