OVH Cloud OVH Cloud

Trigger et valeur Null

1 réponse
Avatar
Saulot
Bonjour,
j'ai une table d'historique dans laquelle je stocke une requete SQL
d'insertion lorsque je supprime un enregistrement. (ca me permet de faire un
rollback)
Mon pb, c que le trigger refuse de s'enclencher dès qu'une Valeur Null
apparait dans une des colonnes. (qui autorise le Null bien entendu).
Dans l'exemple ci-dessous : la variable @Request me sert à stocker
l'instruction SQL.
Je convertit toutes les données Non Varchar en varchar.

Dans mon test, la variable @cPropositionMaitre est NULL... Cette valeur fait
foirer l'instanciation de la variable @Request qui se retrouve à Null elle
aussi.
Quand il tente d'inserer cette valeur dans ma table d'historique, ca plante
parce que la colonne SupInsert qui stocke le SQL n'accepte pas le Null.

Help please :(

*************
CREATE TRIGGER TPropositionsDelete ON dbo.TPropositions
FOR DELETE
AS
DECLARE @cProposition Varchar(50)
DECLARE @cQuestion Varchar(50)
DECLARE @cSociete Varchar(50)
DECLARE @cAuteur Varchar(50)
DECLARE @OrdreProposition Numeric
DECLARE @Archiver Bit
DECLARE @PropositionValide Bit
DECLARE @NbrPoint Float
DECLARE @IISACreate Bit
DECLARE @cPropositionMaitre Varchar(50)
DECLARE @DateCreate DateTime
DECLARE @DateEdit DateTime

DECLARE @Request Varchar(5000)

DECLARE MyCurseur CURSOR FOR SELECT * FROM Deleted

OPEN MyCurseur
FETCH NEXT FROM MyCurseur INTO
@cProposition,@cQuestion,@cSociete,@cAuteur,@OrdreProposition,@Archiver,@Pro
positionValide,@NbrPoint,@IISACreate,@cPropositionMaitre,@DateCreate,@DateEd
it
IF @@FETCH_STATUS = 0
BEGIN
WHILE @@FETCH_STATUS=0
BEGIN
Select @Request='INSERT INTO TPropositions VALUES (''' + @cProposition +
''',''' + @cQuestion + ''',''' + @cSociete + ''',''' + @cAuteur + ''',' +
CONVERT(Varchar(20),@OrdreProposition) + ',''' +
CONVERT(Varchar(20),@Archiver) + ',' +
CONVERT(Varchar(20),@PropositionValide) + ',' +
CONVERT(Varchar(20),@NbrPoint) + ',' + CONVERT(Varchar(20),@IISACreate) +
',''' + @cPropositionMaitre + ''',''' + CONVERT(Varchar(20),@DateCreate) +
''',''' + CONVERT(Varchar(20),@DateEdit) + ''')'

INSERT INTO TSuppressions
VALUES('TPropositions',@cProposition,@Request,current_timestamp)
FETCH NEXT FROM MyCurseur INTO
@cProposition,@cQuestion,@cSociete,@cAuteur,@OrdreProposition,@Archiver,@Pro
positionValide,@NbrPoint,@IISACreate,@cPropositionMaitre,@DateCreate,@DateEd
it
END
END

CLOSE MyCurseur
DEALLOCATE MyCurseur

1 réponse

Avatar
Fred BROUARD
C'est normal....

Chose fondamentale à comprendre :
*NULL n'est pas une valeur, c'est au contraire l'absence de valeur*
A lire : http://sqlpro.developpez.com/SQL_AZ_E.html#NULL

Donc, utiliser un convertisseur permettant de passer du marqueur MULL à une
valeur déterminée, comme COALESCE par exemple.
A lire :
http://sqlpro.developpez.com/SQL_AZ_2.html#SELECT_operateurs_null

Saulot a écrit:
Bonjour,
j'ai une table d'historique dans laquelle je stocke une requete SQL
d'insertion lorsque je supprime un enregistrement. (ca me permet de faire un
rollback)
Mon pb, c que le trigger refuse de s'enclencher dès qu'une Valeur Null
apparait dans une des colonnes. (qui autorise le Null bien entendu).
Dans l'exemple ci-dessous : la variable @Request me sert à stocker
l'instruction SQL.
Je convertit toutes les données Non Varchar en varchar.

Dans mon test, la variable @cPropositionMaitre est NULL... Cette valeur fait
foirer l'instanciation de la variable @Request qui se retrouve à Null elle
aussi.
Quand il tente d'inserer cette valeur dans ma table d'historique, ca plante
parce que la colonne SupInsert qui stocke le SQL n'accepte pas le Null.

Help please :(

*************
CREATE TRIGGER TPropositionsDelete ON dbo.TPropositions
FOR DELETE
AS
DECLARE @cProposition Varchar(50)
DECLARE @cQuestion Varchar(50)
DECLARE @cSociete Varchar(50)
DECLARE @cAuteur Varchar(50)
DECLARE @OrdreProposition Numeric
DECLARE @Archiver Bit
DECLARE @PropositionValide Bit
DECLARE @NbrPoint Float
DECLARE @IISACreate Bit
DECLARE @cPropositionMaitre Varchar(50)
DECLARE @DateCreate DateTime
DECLARE @DateEdit DateTime

DECLARE @Request Varchar(5000)

DECLARE MyCurseur CURSOR FOR SELECT * FROM Deleted

OPEN MyCurseur
FETCH NEXT FROM MyCurseur INTO
@cProposition,@cQuestion,@cSociete,@cAuteur,@OrdreProposition,@Archiver,@Pro
positionValide,@NbrPoint,@IISACreate,@cPropositionMaitre,@DateCreate,@DateEd
it
IF @@FETCH_STATUS = 0
BEGIN
WHILE @@FETCH_STATUS=0
BEGIN
Select @Request='INSERT INTO TPropositions VALUES (''' + @cProposition +
''',''' + @cQuestion + ''',''' + @cSociete + ''',''' + @cAuteur + ''',' +
CONVERT(Varchar(20),@OrdreProposition) + ',''' +
CONVERT(Varchar(20),@Archiver) + ',' +
CONVERT(Varchar(20),@PropositionValide) + ',' +
CONVERT(Varchar(20),@NbrPoint) + ',' + CONVERT(Varchar(20),@IISACreate) +
',''' + @cPropositionMaitre + ''',''' + CONVERT(Varchar(20),@DateCreate) +
''',''' + CONVERT(Varchar(20),@DateEdit) + ''')'

INSERT INTO TSuppressions
VALUES('TPropositions',@cProposition,@Request,current_timestamp)
FETCH NEXT FROM MyCurseur INTO
@cProposition,@cQuestion,@cSociete,@cAuteur,@OrdreProposition,@Archiver,@Pro
positionValide,@NbrPoint,@IISACreate,@cPropositionMaitre,@DateCreate,@DateEd
it
END
END

CLOSE MyCurseur
DEALLOCATE MyCurseur





--Une première correction du code :

DECLARE MyCurseur CURSOR
FOR
SELECT *
FROM Deleted

OPEN MyCurseur

FETCH NEXT FROM MyCurseur
INTO @cProposition, @cQuestion, @cSociete,
@cAuteur,@OrdreProposition, @Archiver,
@PropositionValide, @NbrPoint, @IISACreate,
@cPropositionMaitre, @DateCreate, @DateEdit

WHILE @@FETCH_STATUS=0
BEGIN
SET @Request= 'INSERT INTO TPropositions VALUES ('''
+ COALESCE(@cProposition, '') + ''','''
+ COALESCE(@cQuestion, '') + ''','''
+ COALESCE(@cSociete, '') + ''','''
+ COALESCE(@cAuteur, '') + ''','
+ CONVERT(Varchar(20),COALESCE(@OrdreProposition, 0)) + ','
+ CONVERT(Varchar(20),COALESCE(@Archiver, 0)) + ','
+ CONVERT(Varchar(20),COALESCE(@PropositionValide, 0)) + ','
+ CONVERT(Varchar(20),COALESCE(@NbrPoint, 0)) + ','
+ CONVERT(Varchar(20),COALESCE(@IISACreate, 0)) + ','''
+ COALESCE(@cPropositionMaitre, '') + ''','''
+ COALESCE(CONVERT(Varchar(20),@DateCreate), ''NULL'') + ''','''
+ COALESCE(CONVERT(Varchar(20),@DateEdit, ''NULL'') + ''')'

INSERT INTO TSuppressions
VALUES('TPropositions',@cProposition,@Request,current_timestamp)

FETCH NEXT FROM MyCurseur
INTO @cProposition, @cQuestion, @cSociete,
@cAuteur,@OrdreProposition, @Archiver,
@PropositionValide, @NbrPoint, @IISACreate,
@cPropositionMaitre, @DateCreate, @DateEdit
END

CLOSE MyCurseur

DEALLOCATE MyCurseur

/**************************

Il faudrait vérifier en faisant cela dans une SP avec un PRINT de @Request si le
COALESCE avec NULL des dates est OK...

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************