0
votes

SQL Server Procédure stockée Obtenez une colonne dans la dernière instruction SELECT SELECT SELECT

J'ai une procédure stockée qui sélectionne quelques enregistrements d'une table. Dans la même procédure stockée, je souhaite exécuter une instruction de mise à jour faisant référence à la clé primaire à la requête de sélection exécutée ci-dessus.

comme exemple P>

 create table emp
(id int, name varchar(30),age int,status bit)

insert into emp values (1,'sam',23,null)
insert into emp values (2,'mike',33,null) 
insert into emp values (3,'marc',42,null) 



create procedure myproc as
begin
select top 1 id,name from emp where age>30 order by id --it will return row number 2 with id "2"
update emp set status='1' where id =2 -- "2" is the id we got as a result of above select query
end


5 commentaires

Cela n'est pas clair. Votre SELECT va renvoyer plusieurs lignes, donc avec votre update (qui fait référence à la même table) que vous souhaitez update la valeur de col5 avec plusieurs valeurs de col1 de la même table où une seule valeur de col1 a la valeur de chaque valeur dans col1 ? Ce serait impossible et n'a pas de sens. Exemples de données et attendre des résultats vaut mieux expliquer ce que vous êtes vraiment après.


@Larnu pourriez-vous s'il vous plaît aider maintenant


Juste pour clarifier: Vous souhaitez mettre à jour des enregistrements et obtenir également les données stockées dans le tableau avant la mise à jour sous forme de résultatsset de la procédure stockée. (Ou voulez-vous à la fois les valeurs précédentes et nouvelles?)


S'il vous plaît voir la modification pour obtenir plus de clarté


@Sachumine Vos modifications ne sont pas cohérentes, ce qui me suggère que soit vous n'avez pas d'exigence d'entreprise claire ou que vous ne pouvez pas les présenter correctement. S'il vous plaît dites-nous, ce dont vous avez vraiment besoin.


3 Réponses :


1
votes

Vous semblez vouloir:

create procedure myproc
as
begin
    select col1, col2, col3 
    into #tempt
    from table;

    update table 
    set col5 = value 
    where col1 in (select col1 from #tempt)
end;


4 commentaires

Merci de votre aide. Je cherche s'il existe une autre façon la plus optimisée de l'obtenir.


@Sachumine Pourquoi pensez-vous que cette solution est moins optimisée?


à cause de 2 déclarations sélectionnées


@Sachumine Query / SP La performance n'est pas mesurée dans le nombre de déclarations de sélection.



0
votes

Si vous ne voulez pas subquiery, vous pouvez rejoindre:

create procedure myproc
as
begin
    select col1, col2, col3 
    from table
    where 'some conditions'

    update t1 
    set col5 = value
    from table t1 
        inner join 
            (
                select col1
                    --obviusly you do not need this columns here..., col2, col3 
                from table
                where 'some conditions'
            )t2
        on t1.col1 = t2.col1
end


0 commentaires

1
votes

Si vous souhaitez mettre à jour quelque chose et obtenir les données stockées dans le tableau avant la mise à jour, vous pouvez utiliser une requête simple update avec sortie xxx < / Pré>

Sidenote : Cette question a été mise à jour plusieurs fois, cette réponse est basée sur la mise à jour où vous avez ajouté la définition de la table EMP Mise en œuvre de votre logique commerciale ( Révision 6 ).


0 commentaires