久久久久久久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 中刪除行)
主站蜘蛛池模板: 亚洲午夜网 | 韩国精品在线观看 | 粉嫩一区二区三区国产精品 | 国产乱人伦| 国产一区二区三区视频 | 国产精品中文字幕在线观看 | 91视频在线看 | 欧美精品久久久 | 亚洲免费一区二区 | 国产 日韩 欧美 在线 | 精品国产精品三级精品av网址 | 一级全黄少妇性色生活免费看 | 激情视频网站 | 国产精品一区二区视频 | 日韩专区中文字幕 | 久久久久久成人 | 做a视频 | 精品国产欧美 | 日韩精品成人 | 欧美中文字幕 | 亚洲欧美日韩精品久久亚洲区 | 一区二区三区四区国产 | 香蕉二区 | 久久综合狠狠综合久久综合88 | 先锋资源在线 | 99福利视频导航 | 不卡一区二区在线观看 | 欧美精品成人一区二区三区四区 | 一级黄色短片 | 国产视频福利一区 | 日本一区二区三区在线观看 | 亚州成人 | 欧美激情欧美激情在线五月 | 九九久久精品视频 | 欧美激情综合 | 国产精品特级片 | 成人av观看 | 精品国产乱码一区二区三区a | 久久久精品一区 | av性色 | 91麻豆精品国产91久久久资源速度 |