Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Détermination du résultat de l'instruction SQL MERGE

Ce que vous pouvez faire est de créer une table temporaire (ou une variable de table) et d'y envoyer votre sortie - ajoutez des champs significatifs à votre clause OUTPUT pour indiquer clairement quelle ligne a été affectée par quelle action :

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

MISE À JOUR : ah, d'accord, vous voulez donc appeler cela depuis .NET ! Eh bien, dans ce cas, appelez-le simplement en utilisant le .ExecuteReader() méthode sur votre SqlCommand objet - les éléments que vous produisez en utilisant OUTPUT... sera renvoyé à l'appelant .NET en tant que jeu de résultats - vous pouvez parcourir cela :

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

Vous devriez récupérer le "$action" résultant de ce lecteur de données.