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
Version imprimable
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 :nono: : msdn sql server: CASE WHEN
Code:
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:
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:
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:
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 +
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 ?