Voilà ce que j'aimerais faire :
IF ( SELECT d.correctionStatus FROM data d < 0 )
BEGIN
Mais la syntaxe après IF laisse à désirer ....
Quel est la solution pour écrire correctement ceci en Transac SQL
merci de votre aide
Voilà ce que j'aimerais faire :
IF ( SELECT d.correctionStatus FROM data d < 0 )
BEGIN
Mais la syntaxe après IF laisse à désirer ....
Quel est la solution pour écrire correctement ceci en Transac SQL
merci de votre aide
Il faut utiliser CASE WHEN qui est du SQL standard.
SELECT CASE d.correctionStatus FROM data d
WHEN <0
THEN
..
ELSE
...
J'obtiens encore une erreur![]()
envoie l'erreur que ca te genere.
Il faudrait un minimum lire la doc: msdn sql server: CASE WHEN
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT (CASE WHEN d.correctionStatus <0 THEN 1 ELSE 2 END) FROM data
Oui en effet, mais ça me pose toujours un problème de syntaxe
SELECT
(CASE
WHEN d.correctionStatus <0
THEN
INSERT INTO Delta_Transac_Delete (
CHARGE_CODE,
AMOUNT,
TAX_CODE,
TAX_AMOUNT,
TOTAL_AMOUNT,
CORRECTION_STATUS,
ORIGIN,
TAX_STATUS,
ISOLATED_INVOICE_ID,
STATUS_DELTA
)
SELECT *,'DELETED' FROM DATA
ELSE
INSERT INTO Delta_Transac_Delete (
TRANS_ID,
CREDITOR_ID,
DEBTOR_ID,
VENDOR_ID,
BUYER_ID,
TRANS_DATE,
RECORD_DATE,
LABEL,
CURRENCY,
DISPATCH_CODE1,
DISPATCH_CODE2,
DISPATCH_CODE3,
TRANSACTION_SET_ID,
BR_ROLE,
BR_TYPE,
OFFER_CODE,
SUBSCRIPTION_CODE,
CHARGE_CODE,
AMOUNT,
TAX_CODE,
TAX_AMOUNT,
TOTAL_AMOUNT,
CORRECTION_STATUS,
ORIGIN,
TAX_STATUS,
ISOLATED_INVOICE_ID,
STATUS_DELTA
)
SELECT *,'UPDATED' FROM deleted
END)
FROM DATA
Voici les erreurs que j'ai :
Msg 156, Level 15, State 1, Line 7
Incorrect syntax near the keyword 'INSERT'.
Msg 156, Level 15, State 1, Line 21
Incorrect syntax near the keyword 'ELSE'.
Msg 102, Level 15, State 1, Line 54
Incorrect syntax near ')'.
Décidemment tu codes tête baissée sans regarder la doc.
La première chose à faire aurait de présenter ce début de code, comme l'exige la charte du forum, pour ne pas qu'on confonde si ta demande est en procédurale (Transact SQL avec IF) ou ensembliste (SQL avec CASE WHEN) . Là tu mélanges les 2 syntaxes.
En plus avec ta façon de faire tu n'es pas au bout de tes peines puisque je vois le mot clé deleted qui est caractéristique des triggers.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 IF EXISTS (SELECT * FROM DATE WHERE d.correctionStatus <0 ) INSERT INTO Delta_Transac_Delete ( CHARGE_CODE, AMOUNT, TAX_CODE, TAX_AMOUNT, TOTAL_AMOUNT, CORRECTION_STATUS, ORIGIN, TAX_STATUS, ISOLATED_INVOICE_ID, STATUS_DELTA ) SELECT -- on ne mets jamais d'étoile, si la table est modifiée ça devient inmaintenable CHARGE_CODE, AMOUNT, TAX_CODE, TAX_AMOUNT, TOTAL_AMOUNT, CORRECTION_STATUS, ORIGIN, TAX_STATUS, ISOLATED_INVOICE_ID, STATUS_DELTA 'DELETED' FROM DATA ELSE INSERT INTO Delta_Transac_Delete ( TRANS_ID, CREDITOR_ID, DEBTOR_ID, VENDOR_ID, BUYER_ID, TRANS_DATE, RECORD_DATE, LABEL, CURRENCY, DISPATCH_CODE1, DISPATCH_CODE2, DISPATCH_CODE3, TRANSACTION_SET_ID, BR_ROLE, BR_TYPE, OFFER_CODE, SUBSCRIPTION_CODE, CHARGE_CODE, AMOUNT, TAX_CODE, TAX_AMOUNT, TOTAL_AMOUNT, CORRECTION_STATUS, ORIGIN, TAX_STATUS, ISOLATED_INVOICE_ID, STATUS_DELTA ) SELECT TRANS_ID, CREDITOR_ID, DEBTOR_ID, VENDOR_ID, BUYER_ID, TRANS_DATE, RECORD_DATE, LABEL, CURRENCY, DISPATCH_CODE1, DISPATCH_CODE2, DISPATCH_CODE3, TRANSACTION_SET_ID, BR_ROLE, BR_TYPE, OFFER_CODE, SUBSCRIPTION_CODE, CHARGE_CODE, AMOUNT, TAX_CODE, TAX_AMOUNT, TOTAL_AMOUNT, CORRECTION_STATUS, ORIGIN, TAX_STATUS, ISOLATED_INVOICE_ID, 'UPDATED' FROM deleted
------->OUI c'est dans un trigger ! le voici d'ailleurs :
et là je me demande si le "SELECT * FROM DELETED " est judicieux parce que je n'utilise que la dernière ligne supprimée ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 CREATE TRIGGER trg_U_transac ON Transac FOR UPDATE AS IF EXISTS (SELECT * FROM DELETED WHERE d.correctionStatus <0 ) INSERT INTO Delta_Transac_Delete ( CHARGE_CODE, AMOUNT, TAX_CODE, TAX_AMOUNT, TOTAL_AMOUNT, CORRECTION_STATUS, ORIGIN, TAX_STATUS, ISOLATED_INVOICE_ID, STATUS_DELTA ) SELECT -- on ne mets jamais d'étoile, si la table est modifiée ça devient inmaintenable CHARGE_CODE, AMOUNT, TAX_CODE, TAX_AMOUNT, TOTAL_AMOUNT, CORRECTION_STATUS, ORIGIN, TAX_STATUS, ISOLATED_INVOICE_ID, STATUS_DELTA 'DELETED' FROM DELETED ELSE INSERT INTO Delta_Transac_Delete ( TRANS_ID, CREDITOR_ID, DEBTOR_ID, VENDOR_ID, BUYER_ID, TRANS_DATE, RECORD_DATE, LABEL, CURRENCY, DISPATCH_CODE1, DISPATCH_CODE2, DISPATCH_CODE3, TRANSACTION_SET_ID, BR_ROLE, BR_TYPE, OFFER_CODE, SUBSCRIPTION_CODE, CHARGE_CODE, AMOUNT, TAX_CODE, TAX_AMOUNT, TOTAL_AMOUNT, CORRECTION_STATUS, ORIGIN, TAX_STATUS, ISOLATED_INVOICE_ID, STATUS_DELTA ) SELECT TRANS_ID, CREDITOR_ID, DEBTOR_ID, VENDOR_ID, BUYER_ID, TRANS_DATE, RECORD_DATE, LABEL, CURRENCY, DISPATCH_CODE1, DISPATCH_CODE2, DISPATCH_CODE3, TRANSACTION_SET_ID, BR_ROLE, BR_TYPE, OFFER_CODE, SUBSCRIPTION_CODE, CHARGE_CODE, AMOUNT, TAX_CODE, TAX_AMOUNT, TOTAL_AMOUNT, CORRECTION_STATUS, ORIGIN, TAX_STATUS, ISOLATED_INVOICE_ID, 'UPDATED' FROM DELETED
Voila une version correcte de votre trigger :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 CREATE TRIGGER trg_U_transac ON Transac FOR UPDATE AS INSERT INTO Delta_Transac_Delete ( CHARGE_CODE, AMOUNT, TAX_CODE, TAX_AMOUNT, TOTAL_AMOUNT, CORRECTION_STATUS, ORIGIN, TAX_STATUS, ISOLATED_INVOICE_ID, STATUS_DELTA ) SELECT -- on ne mets jamais d'étoile, si la table est modifiée ça devient inmaintenable CHARGE_CODE, AMOUNT, TAX_CODE, TAX_AMOUNT, TOTAL_AMOUNT, CORRECTION_STATUS, ORIGIN, TAX_STATUS, ISOLATED_INVOICE_ID, STATUS_DELTA 'DELETED' FROM DELETED WHERE d.correctionStatus < 0 INSERT INTO Delta_Transac_Delete ( TRANS_ID, CREDITOR_ID, DEBTOR_ID, VENDOR_ID, BUYER_ID, TRANS_DATE, RECORD_DATE, LABEL, CURRENCY, DISPATCH_CODE1, DISPATCH_CODE2, DISPATCH_CODE3, TRANSACTION_SET_ID, BR_ROLE, BR_TYPE, OFFER_CODE, SUBSCRIPTION_CODE, CHARGE_CODE, AMOUNT, TAX_CODE, TAX_AMOUNT, TOTAL_AMOUNT, CORRECTION_STATUS, ORIGIN, TAX_STATUS, ISOLATED_INVOICE_ID, STATUS_DELTA ) SELECT TRANS_ID, CREDITOR_ID, DEBTOR_ID, VENDOR_ID, BUYER_ID, TRANS_DATE, RECORD_DATE, LABEL, CURRENCY, DISPATCH_CODE1, DISPATCH_CODE2, DISPATCH_CODE3, TRANSACTION_SET_ID, BR_ROLE, BR_TYPE, OFFER_CODE, SUBSCRIPTION_CODE, CHARGE_CODE, AMOUNT, TAX_CODE, TAX_AMOUNT, TOTAL_AMOUNT, CORRECTION_STATUS, ORIGIN, TAX_STATUS, ISOLATED_INVOICE_ID, 'UPDATED' FROM DELETED WHERE correctionStatus >=0 OR correctionStatus IS NULL
A +
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
* * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *
Merci à tous pour votre aide !
Je suis en fait un dev pas un DBA donc parfois je pose sans doute des questions qui semblent idiotes.
A ce sujet, pour le comportement de la table virtuelle DELETED : je suppose qu'elle ne contient que la dernière ligne supprimée ?
Partager