如果sql server中不存在该行,是否可以使用“if not exists”来插入行?

时间:2012-03-28 16:16:54

标签: sql sql-server

insert into Attributes (Id, Disabled, AttributeValue) 
values (@id, @disabled, @attr_value)
if not exists
(
select * from Attributes
where 
Id = @id
)
  • 不确定,如果这是一个有效的查询。
  • 我见过人们在不存在的地方使用。有什么区别以及如何使用不存在的地方?当我把放在不存在的地方时,它会说“语法附近的语法不正确。”

我也检查了这些问题。但是,它似乎没有使用插入的查询,如果不存在Only inserting a row if it's not already theresql conditional insert if row doesn't already exist

  • 我错过了什么吗?我应该只使用哪里不存在

3 个答案:

答案 0 :(得分:8)

将其更改为INSERT INTO SELECT

INSERT INTO Attributes (Id, Disabled, AttributeValue) 
SELECT @id, @disabled, @attr_value
WHERE NOT EXISTS
(
    select * from Attributes
    where 
    Id = @id
)

答案 1 :(得分:2)

你需要执行类似这样的事情

IF NOT EXISTS (select 1 from Attributes where Id = @id)
BEGIN
    insert into Attributes (Id, Disabled, AttributeValue) 
    values (@id, @disabled, @attr_value)
END

这通常使用else子句来更新行(如果存在)。

答案 2 :(得分:2)

考虑使用MERGE

MERGE INTO Attributes 
   USING ( values (@id, @disabled, @attr_value ) ) 
            AS source ( Id, Disabled, AttributeValue )
      ON source.Id = Attributes.Id
WHEN NOT MATCHED THEN
   INSERT ( Id, Disabled, AttributeValue )
      VALUES ( Id, Disabled, AttributeValue );

一个优点是您还可以在Id存在时更新值,例如

MERGE INTO Attributes 
   USING ( values (@id, @disabled, @attr_value ) ) 
            AS source ( Id, Disabled, AttributeValue )
      ON source.Id = Attributes.Id
WHEN MATCHED THEN
   UPDATE
      SET Id = source.Id,
          Disabled = source.Disabled, 
          AttributeValue = source.AttributeValue
WHEN NOT MATCHED THEN
   INSERT ( Id, Disabled, AttributeValue )
      VALUES ( Id, Disabled, AttributeValue );