仅当行不存在时,如何在 SQL Server 中执行插入操作? [复制]

Posted

技术标签:

【中文标题】仅当行不存在时,如何在 SQL Server 中执行插入操作? [复制]【英文标题】:How to perform insert operation in SQL Server only when row does not exists? [duplicate] 【发布时间】:2019-04-16 08:24:57 【问题描述】:
Table:# result
Name      Issues    Years      Value
Rani    Critical    2018        0.90
Rani    Critical    2018        0.00

Expected Output:-
Name      Issues    Year       Value
Rani    Critical    2018       0.90
Rani    Critical    2018       0.00
Rani        Null   2019        0.00


select Name=’Rani’,Issues=' Critical', years, ,Value from #result;

Insert #result (Name,years,Value) values(‘Rani’,year(getdate()),0)  

我只想在当前年份(例如:-2019)时对#result 表执行插入操作 是不存在的。 如果 #result 表上存在当前年份,则不应执行插入操作。

【问题讨论】:

SQL Server insert if not exists best practice 的可能重复项。问题是针对 SQL Server,但答案是标准 sql,也适用于此处。 【参考方案1】:

您可以使用 IF NOT EXISTS 来执行此操作。

DECLARE @year INT = YEAR(GETDATE())
IF NOT EXISTS(SELECT 1 FROM #result WHERE Year = @year )
BEGIN
Insert #result (Name,years,Value) values(‘Rani’,@year,0)  
END

【讨论】:

这在默认隔离级别下不是线程安全的(如果不在事务中,则在任何隔离级别) @MartinSmith,如果我们使用临时表,有什么问题吗?你能告诉我,需要修复什么。 好点,因为它是一个本地范围的临时表,这很好。没有其他会话可以向其插入行 我不认为GETDATE() 与这个问题有任何关系,虽然很难从这个问题中看出。 链接为副本的问题中的解决方案有什么问题?

以上是关于仅当行不存在时,如何在 SQL Server 中执行插入操作? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

仅当行不存在时,如何将一行添加到不同子目录下的多个文本文件?

仅当行不存在时才附加到 csv

当行不存在时,“SELECT FOR UPDATE”是不是会阻止其他连接插入?

MYSQL - 仅当 LEFT JOIN 中的行不存在时才选择

仅当行已更改时,MySQL 才在更新后触发

仅当行填充等于 3 个字节时,C++ 读取 BMP 文件才有效