2013-06-28 1 views
1

J'ai une séquence que j'ai besoin d'utiliser pour recalculer les deux champs de la clé primaire si une correspondance de mise à jour n'est pas trouvée. Est-il possible d'utiliser encore la déclaration MERGE ici? J'ai essayé QUAND MATCHED PUIS BEGIN, mais BEGIN n'est pas valide ici.Étapes multiples sur QUAND NON CORRESPONDANT possible?

Spécifiquement, j'ai une paire de nombres qui composent la clé primaire. Le premier est un regroupement, et le second est une séquence d'éléments dans le groupe. Si quelque chose ne va pas, le groupe arrive en 99990, et je dois le combiner avec la séquence et utiliser une séquence pour l'incrémenter, puis le séparer en deux. Donc, quand le groupe arrive avec 99990, mes groupes calculés peuvent aller de 99990 à 99999, et le numéro de séquence va alors de 00 à 99.

Je ne vois pas de moyen de le faire dans le cadre de l'affectation INSERT, et je ne peux pas comprendre comment faire le MERGE faire plusieurs étapes, donc je suppose que je suis de retour à UPDATE, IF @@ ROWCOUNT = 0 BEGIN. Quelqu'un a un moyen plus rapide de le faire?

+0

Quels SGBD utilisez-vous? A en juger par le '@@ rowcount' probablement SQL Server? –

+0

C'est SQL Server, comme vous l'avez supposé. – knockNrod

Répondre

0

Malheureusement, il n'est pas possible de faire plusieurs étapes dans un MERGE. Parfois, la nouvelle syntaxe Common Table Expression peut être utilisée, mais j'ai recouru à un UPDATE, IF @@ ROWcOUNT = 0, INSERT afin que je puisse faire plusieurs étapes sur l'insertion.

3

Cela fonctionne,

  1. Déclarez une variable de drapeau (bit) appelé @isinsert
  2. Initialiser avec la valeur de 1.
  3. Sur la clause de mise à jour mis à 0.

Comme ceci: (en supposant une table appelée table1 avec un champ 'id' numérique et un champ 'field1' de nvarchar).

declare @id numeric(18,0)     -- That's the he lookup key 
set @id=999        -- We use id as the search key 
              -- You can use any other field  
declare @field nvarchar(50) 
set @field = 'insert or update value(s)' -- This is the new value 

declare @isinsert bit      -- This is a flag that will 
set @isinsert=1       -- indicate whether an insert or 
              -- an update were performed 

MERGE table1 AS target 
    USING (SELECT @field) AS source (field1) 
    ON (target.id = @id) 
    WHEN MATCHED THEN 
     UPDATE SET field1 = source.field1 
     ,@isinsert = 0      -- Set @isinsert to 0 on updates 
    WHEN NOT MATCHED THEN 
     INSERT (field1) 
     VALUES (source.field1); 

if (@isinsert=1) print concat('inserted record at id: ',@@IDENTITY) 
else print concat('updated record at id: ',@id) 
+0

Kewl. Je n'ai pas encore eu le temps de le faire, mais ça a l'air intéressant. Je pense que je vais apprendre quelque chose de nouveau. Dans cet esprit, je suis en train de voter ceci. Il est trop tard pour l'utiliser, mais il n'est jamais trop tard pour apprendre quelque chose de nouveau. Merci. – knockNrod

Questions connexes