[PROC] utiliser des données selectionnées dans une procédure.
Bonjour,
Je souhaiterais affecter des valeurs dans @v_ind_code, @v_pay_code, @v_indnat_principale mais je ne vois pas comment m'y prendre.
En oracle j'aurais fait SELECT INTO unevariableRECORD et je l'aurais exploitée, mais sur sql server, je n'ai pas trouvé d'équivalent.
Pourriez-vous eclairer ma lanterne?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| CREATE PROCEDURE [dbo].[web_nationalite]
(
@id_ind int,
@id_pays int
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @v_ind_code int
DECLARE @v_pay_code int
DECLARE @v_indnat_principale bit
IF( SELECT @v_ind_code = i.ind_code, @v_pay_code = i.pay_code, i.indnat_date, i.indnat_date_fin, @v_indnat_principale = i.indnat_principale
FROM individu_nationalite AS i
WHERE i.ind_code = @id_ind AND i.indnat_principale = 1 )
IF(@v_pay_code <> @id_pays)
UPDATE individu_nationalite SET indnat_date_fin = CURRENT_TIMESTAMP, indnat_principale = 0
WHERE individu_nationalite.ind_code = @id_ind
INSERT INTO individu_nationalite (ind_code, pay_code, indnat_date, indnat_date_fin, indnat_principale)
VALUES(@id_ind, @id_pays, CURRENT_TIMESTAMP, NULL, 1)
ELSE
INSERT INTO individu_nationalite (ind_code, pay_code, indnat_date, indnat_date_fin, indnat_principale)
VALUES(@id_ind, @id_pays, CURRENT_TIMESTAMP, NULL, 1)
END |
Merci d'avance
Axel Masset
EDIT: J'ai trouvé une piste, les CURSOR, je vais approfondir ça.
Pas de curseur si possible
Bonsoir,
Evitez les curseurs si possible, c'est très lent (dans un rapport mini de 1 à 50) par rapport à un traitement ensembliste.
J'ai du mal à lire votre code, est ce ceci que vous voulez faire ?
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
UPDATE individu_nationalite
SET indnat_date_fin = CURRENT_TIMESTAMP, indnat_principale = 0
WHERE
individu_nationalite.ind_code = @id_ind
AND
pay_code = @id_pays
AND
indnat_principale = 1
INSERT INTO individu_nationalite (ind_code, pay_code, indnat_date, indnat_date_fin, indnat_principale)
SELECT @id_ind, @id_pays, CURRENT_TIMESTAMP, NULL, 1 |
@+
Si MERGE n'est pas disponible
Bonjour,
Si vous n'êtes pas sous 2008, plutôt que le curseur, vous pouvez essayer
Code:
1 2 3 4 5 6 7 8 9
|
--Crée la nouvelle nationalité principale si elle n'existe pas.
INSERT INTO individu_nationalite (ind_code, pay_code, indnat_date, indnat_date_fin, indnat_principale)
SELECT @id_ind, @id_pays, CURRENT_TIMESTAMP, NULL, 1
FROM individu_nationalite WHERE i.indnat_principale = 1 and ind_code = @id_ind and pay_code <> @id_pays
--Désactivation de l'ancienne si elle existe.
UPDATE individu_nationalite SET indnat_date_fin = CURRENT_TIMESTAMP, indnat_principale = 0
WHERE i.indnat_principale = 1 and ind_code = @id_ind and pay_code <> @id_pays |
Si ça fonctionne, utilisez une transaction car vous allez avoir deux identités principales au milieu de la transaction ;)
@+