2010-05-31 7 views
4

Existe-t-il un moyen de déterminer si un enregistrement a été apparié ou non (que l'enregistrement ait été inséré ou mis à jour) après avoir appelé MERGE?Détermination du résultat de l'instruction SQL MERGE

Idéalement, je voudrais l'exporter vers un paramètre.

Edit: J'ai la déclaration de fusion produire ce qui est arrivé dans mon studio de gestion en utilisant la déclaration suivante: que j'ai eu la déclaration de fusion suivante:

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 $action; 

J'essaie d'utiliser un paramètre pour obtenir la sortie '$ action'.

+0

Pour quelle base de données? –

+0

édité avec plus d'infos – petejamd

+0

Je ne peux pas tester cela mais l'utilisez-vous de manière à ne jamais affecter qu'une seule ligne? Si oui, 'OUTPUT @SomeVariable = $ action"; 'travail? –

Répondre

5

Ce que vous pouvez faire est de créer une table temporaire (ou une variable de table) et envoyer votre sortie là-bas - ajouter des champs significatifs à votre clause OUTPUT pour préciser quelle ligne a été affectée par les mesures:

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, donc vous voulez appeler cela à partir de .NET! Eh bien, dans ce cas, il suffit d'appeler à l'aide de la méthode .ExecuteReader() sur votre objet SqlCommand - les choses que vous êtes sortie en utilisant OUTPUT... sera retourné à l'appelant .NET comme un jeu de résultats - vous pouvez parcourir que:

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.

+0

grâce donc il n'y a aucun moyen d'utiliser SqlCommand.Parameters pour obtenir l'action $ alors? – petejamd

+0

en outre, en utilisant ExecuteScalar si vous savez que vous allez seulement obtenir une ligne modifiée est préférable – petejamd

+0

@petej amd: en fait, ExecuteScalar ne devrait être utilisé que si vous avez une ligne * et * une colonne en arrière! Juste un seul résultat qui est. Et non - l'action $ n'est pas accessible via la collection SqlCommand.Parameters - ce n'est ni une entrée ni un paramètre de sortie, mais une partie d'un ensemble de résultats. –

Questions connexes