Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Ustalenie wyniku instrukcji SQL MERGE

Możesz utworzyć tabelę tymczasową (lub zmienną tabeli) i wysłać tam swoje dane wyjściowe — dodać kilka znaczących pól do klauzuli OUTPUT, aby było jasne, na który wiersz wpłynęło jakie działanie:

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

AKTUALIZACJA: ach, ok, więc chcesz wywołać to z .NET ! Cóż, w takim przypadku po prostu wywołaj to za pomocą .ExecuteReader() metoda na twoim SqlCommand obiekt - rzeczy, które wysyłasz za pomocą OUTPUT... zostanie zwrócony do wywołującego .NET jako zestaw wyników - możesz przez to przejść w pętli:

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

Powinieneś odzyskać wynikową "$akcję" z tego czytnika danych.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest najlepszy sposób na uzyskanie ostatniego indexof znaku w SQL 2008?

  2. Zmień nazwy niektórych tabel na Nazwa tabeli + DDMMRRRR

  3. Jak zdrowy jest Twój serwer SQL? Proaktywne monitorowanie bazy danych ma kluczowe znaczenie

  4. Czy możemy napisać oświadczenie o przypadku bez posiadania innego oświadczenia?

  5. jak pobrać dane z bieżącego tygodnia tylko na serwerze SQL?