久久久久久久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 中刪除行)
主站蜘蛛池模板: 亚洲人成网亚洲欧洲无码 | 日韩伦理一区二区 | 亚洲精品久久久久久久久久吃药 | 久久久久久久久久久久久久av | 99色在线| 国外成人在线视频网站 | 久热国产在线 | 91精品国产色综合久久不卡蜜臀 | 欧美一区视频 | 日韩中文字幕一区 | a毛片视频网站 | 女同久久 | a级在线免费| 成人不卡一区二区 | 毛片一区二区三区 | 波波电影院一区二区三区 | 狠狠操网站 | 黄色91在线| 久久99深爱久久99精品 | 91亚洲精华国产 | 91精品国产高清久久久久久久久 | 中文字幕一区二区三区四区五区 | 日韩精品国产精品 | 国产一级淫片免费视频 | 久久亚洲欧美日韩精品专区 | 黄色免费在线观看网址 | 精品欧美一区二区在线观看 | 国产区在线观看 | 国产精品久久久久久久久久久新郎 | 99免费精品 | 神马久久久久久久久久 | 国产精品 亚洲一区 | 一级黄片一级毛片 | 激情五月婷婷 | 91免费入口| 一级片网站视频 | 黑色丝袜三级在线播放 | 国内精品视频在线观看 | 欧美日韩三级视频 | 超碰网址 | 国产高清视频在线观看 |