sql >> Databasteknik >  >> RDS >> Sqlserver

Fastställer resultatet av SQL MERGE-satsen

Vad du kan göra är att skapa en temporär tabell (eller en tabellvariabel) och skicka din utdata dit - lägg till några meningsfulla fält i din OUTPUT-sats för att göra det tydligt vilken rad som påverkades av vilken åtgärd:

DECLARE @OutputTable TABLE (Guid UNIQUEIDENTIFIER, Action VARCHAR(100))

MERGE INTO TestTable as target
USING ( select '00D81CB4EA0842EF9E158BB8FEC48A1E' )
AS source (Guid)
ON ( target.Guid = source.Guid ) 
WHEN MATCHED THEN
UPDATE SET Test_Column = NULL
WHEN NOT MATCHED THEN
INSERT (Guid, Test_Column) VALUES ('00D81CB4EA0842EF9E158BB8FEC48A1E', NULL)
OUTPUT INSERTED.Guid, $action INTO @OutputTable

SELECT
   Guid, Action
FROM
   @OutputTable

UPPDATERING: ah, okej, så du vill ringa detta från .NET ! Tja, i så fall, kalla det bara med .ExecuteReader() metod på din SqlCommand objekt - det du matar ut med OUTPUT... kommer att returneras till .NET-anroparen som en resultatuppsättning - du kan gå igenom det:

using(SqlCommand cmd = new SqlCommand(mergeStmt, connection))
{
   connection.Open();

   using(SqlDataReader rdr = cmd.ExecuteReader())
   {
      while(rdr.Read())
      {
         var outputAction = rdr.GetValue(0);
      }

      rdr.Close();
   }
   connection.Close();
}

Du bör få tillbaka den resulterande "$action" från den dataläsaren.




  1. Tilldela en inloggning till en användare som skapats utan inloggning (SQL-server)

  2. Oracle (PL/SQL):Är UPDATE RETURNING samtidigt?

  3. MySQL 17,6 m rader (1,2 gb) uppdatering av hela tabellen är för långsam

  4. Java JDBC kan inte ansluta till en Oracle-databas med SSL