sql >> Databáze >  >> RDS >> Sqlserver

Jak upsert (aktualizovat nebo vložit) v SQL Server 2005

Zkuste zkontrolovat existenci:

IF NOT EXISTS (SELECT * FROM dbo.Employee WHERE ID = @SomeID)

    INSERT INTO dbo.Employee(Col1, ..., ColN)
    VALUES(Val1, .., ValN)

ELSE

    UPDATE dbo.Employee
    SET Col1 = Val1, Col2 = Val2, ...., ColN = ValN
    WHERE ID = @SomeID

Můžete to snadno zabalit do uložené procedury a jednoduše tuto uloženou proceduru zavolat zvenčí (např. z programovacího jazyka, jako je C# nebo cokoli jiného, ​​co používáte).

Aktualizace: buď můžete celý tento příkaz napsat do jednoho dlouhého řetězce (proveditelné - ale ve skutečnosti to není příliš užitečné) - nebo jej můžete zabalit do uložené procedury:

CREATE PROCEDURE dbo.InsertOrUpdateEmployee
       @ID INT,
       @Name VARCHAR(50),
       @ItemName VARCHAR(50),  
       @ItemCatName VARCHAR(50),
       @ItemQty DECIMAL(15,2)
AS BEGIN
    IF NOT EXISTS (SELECT * FROM dbo.Table1 WHERE ID = @ID)
       INSERT INTO dbo.Table1(ID, Name, ItemName, ItemCatName, ItemQty)
       VALUES(@ID, @Name, @ItemName, @ItemCatName, @ItemQty)
    ELSE
       UPDATE dbo.Table1
       SET Name = @Name,
           ItemName = @ItemName,
           ItemCatName = @ItemCatName,
           ItemQty = @ItemQty
       WHERE ID = @ID
END

a pak stačí zavolat tuto uloženou proceduru z vašeho kódu ADO.NET



  1. Nelze vytvořit požadovanou službu [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

  2. Vyberte řádky, ve kterých se změnila hodnota sloupce

  3. Jak vygenerovat/autoincrement guid na insert bez triggerů a manuálních insertů v mysql?

  4. jak mohu porovnat dva řetězce, i když se liší o 1 znak?