Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Ermitteln des Ergebnisses der SQL MERGE-Anweisung

Was Sie tun könnten, ist, eine temporäre Tabelle (oder eine Tabellenvariable) zu erstellen und Ihre Ausgabe dorthin zu senden - fügen Sie Ihrer OUTPUT-Klausel einige aussagekräftige Felder hinzu, um deutlich zu machen, welche Zeile von welcher Aktion betroffen war:

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

AKTUALISIERUNG: ah, okay, Sie wollen das also von .NET aus aufrufen! Nun, in diesem Fall rufen Sie es einfach mit .ExecuteReader() auf -Methode auf Ihrem SqlCommand Objekt - das Zeug, das Sie mit OUTPUT... ausgeben wird als Ergebnismenge an den .NET-Aufrufer zurückgegeben - Sie können das durchlaufen:

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();
}

Sie sollten die resultierende "$action" von diesem Datenleser zurückerhalten.