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

Určení výsledku příkazu SQL MERGE

Co byste mohli udělat, je vytvořit dočasnou tabulku (nebo proměnnou tabulky) a odeslat tam svůj výstup – přidejte do klauzule OUTPUT některá smysluplná pole, aby bylo jasné, který řádek byl jakou akcí ovlivněn:

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

AKTUALIZACE: ah, dobře, takže to chcete volat z .NET! No, v tom případě to prostě zavolejte pomocí .ExecuteReader() ve vašem SqlCommand objekt – obsah, který vydáváte pomocí OUTPUT... bude vráceno volajícímu .NET jako sada výsledků – můžete to procházet:

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

Měli byste získat zpět výslednou "$action" z této čtečky dat.




  1. MySQL:Více řádků jako jeden řádek oddělený čárkami

  2. Zřetězení řetězců v MySQL

  3. VYBRAT řádek podle DATEPART()

  4. kódování UTF8 neodpovídá národnímu prostředí en_US; zvolené nastavení LC_CTYPE vyžaduje kódování LATIN1