2009-08-13 6 views
0

Je voudrais savoir si ce type de procédure stockée est possible, ai-je besoin d'une sorte de structure en boucle ou autre chose? Je veux faire ceci, fondamentalement dans cet ordre:Procédure stockée qui Sélectionne, Conditions, définit des variables, puis insère/met à jour dans une table

  1. obtenir toutes les rangées d'une table ou vue. (table1)
  2. basé sur les colonnes de la table 1, je veux définir les variables à utiliser dans insert/update table2.
  3. Je veux référencer une autre table, (table3), pour trouver une clé à partir de la table1, qui va "Override", tous les cas où les données de la ligne pourraient tomber.
  4. Insérez ou mettez à jour la table2.

Si cela est possible, pourrais-je obtenir une sorte de brouillon dans la réponse? Merci d'avoir lu! plz essayer d'aider! Voici un autre tri de "diagramme" de ce que je pense..

  1. select * from table1
  2. cas [table1] [table1column] - [table1] [table1column] < = 0, paramètre1 = "a" (de nombreux cas)
  3. cas [table1]. [tableID] Existe en table3, paramètre1 = [table3]. [paramètre]
  4. cas [table1]. [tableID] Existe en table2, mise à jour, d'autre insérer

Merci pour toutes les tentatives Si je comprends bien, je vais le poster.

+1

Quel RDBMS?MySQL? Serveur SQL? –

+0

Pouvez-vous formuler votre question différemment? Je trouve qu'il est un peu difficile de comprendre le but de chaque étape, en particulier l'étape 3. Ajouter un peu plus de détails vous aidera également à obtenir une réponse plus précise. –

+0

Avez-vous envisagé de le faire dans une seule instruction SQL? En fonction de votre description, cela peut ne pas nécessiter une procédure stockée avec une boucle, en fonction des détails de ce que vous devez faire. – Chi

Répondre

1

Je vais sauter le pistolet et supposons que vous parlez MS SQL Server.

Oui, ce genre de chose est possible. Voici un peu de code psuedo pour vous lancer:

declare @someTable (
    idx int identity(1,1), 
    column1 type, 
    column2 type, 
    etc type) 

declare @counter 

set @counter = 1 

insert into @someTable (column1, column2, etc) 
select column1, column2, etc from table1 

while @counter < (select max(idx) from @someTable) 
begin 

    -- loop through records and perform logic 
    insert result into table3 

    set @counter = @counter + 1 

end 

Si possible si ... essayez d'utiliser une seule requête. Joignez-vous à vos tables et utilisez les instructions Case pour effectuer la logique.

+0

alors que cela fonctionnerait probablement, la mise en boucle est une mauvaise idée et ne devrait pas être encouragée. Une solution basée sur un ensemble sera meilleure. – HLGEM

+0

C'est ce que je suggère ... il suffit de le faire jusqu'à la fin du post. –

+0

Je vais sélectionner ceci. Je ne l'ai pas complètement étoffé, mais je vais commencer par cette boucle ... Ça va être nul, jusqu'à ce que je trouve comment faire tout ça en une seule requête – Marlon

2

Nous avons besoin de plus d'informations, mais je vous donnerai 98% ou une meilleure chance que tout cela puisse être fait dans deux requêtes (une pour l'insertion, une pour les mises à jour).

Voici un exemple générique pour l'insert:

INSERT INTO [Table2] 
    SELECT 
     t1.[col1], /* use columns from table1 to update table2 */ 
     COALESCE(t3.[col2], t1.[col2]) /* table3 "overrides" table1 */ 
    FROM [Table1] t1 -- get all rows from table1 
    LEFT JOIN [Table3] t3 ON t3.ID = t1.Table3ID 
    LEFT JOIN [Table2] t2 ON t2.ID = t1.Table2ID 
    WHERE t2.OtherColumn IS NULL /* insert - only make changes where the record doesn't already exist */ 

et la mise à jour:

UPDATE t2 
    SET t2.[col1] = t1.[col1], 
     t2.[col2] = COALESCE(t3.[col2], t1.[col2]) 
FROM [table1] t1 
LEFT JOIN [Table3] t3 ON t3.ID = t1.Table3ID 
INNER JOIN [Table2] t2 ON t2.ID = t1.Table2ID /* update - only make changes where the record does already exist */ 
1

Il est difficile de dire sans plus d'informations sur votre modèle de données, mais il existe des cas similaires à celui vous décrivez qui pourrait être manipulé sans itération.

Par exemple, vous pouvez sélectionner une jointure gauche de t1 et t3, utiliser la valeur t3 si elle est présente ou utiliser une expression basée sur la valeur de la colonne t1. Voici un échantillon approximatif.

insert into t2 (column list) 

Select case when t3.Column is not null then t3.Column 
when t1.Column = 'somevalue' then 'someothervalue' 
else...(other conditions/values) end 
... 
from t1 left join t3 on t1.Key = t3.Key 

(de plus en plus de détails sur votre situation spécifique augmente la qualité de l'aide que vous obtenez)

Questions connexes