Problème lors de la création d'une procédure

Signaler
Messages postés
3
Date d'inscription
lundi 4 décembre 2000
Statut
Membre
Dernière intervention
3 avril 2008
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Tout d'abord bonjour :). Voila, j'ai un petit problème c'est que j'essaye de créer une procédure qui permette de supprimer les lignes en double dans une table. J'ai donc réalisé la procédure suivante :

USE

contacts
CREATE

procedure EffaceDouble @table

TABLE, @key
KEYAS

SELECT

DISTINCT
*

INTO replique

FROM @table

GROUP
BY @key

HAVING
COUNT(@key
)
> 1
DELETE

@table

WHERE @key

IN
(SELECT @key

FROM replique
)

INSERT @table

SELECT
*

FROM replique

DROP
TABLE replique

Seulement, j'ai pas mal d'erreur ... :(  :

Msg 156, Niveau 15, État 1, Procédure EffaceDouble, Ligne 3

Syntaxe incorrecte vers le mot clé 'TABLE'.

Msg 1087, Niveau 15, État 2, Procédure EffaceDouble, Ligne 7

La variable de table '@table' doit être déclarée.

Msg 1087, Niveau 15, État 2, Procédure EffaceDouble, Ligne 10

La variable de table '@table' doit être déclarée.

Msg 137, Niveau 15, État 2, Procédure EffaceDouble, Ligne 12

La variable scalaire "@key" doit être déclarée.

Msg 1087, Niveau 15, État 2, Procédure EffaceDouble, Ligne 15

La variable de table '@table' doit être déclarée.

Bref, si vous pouviez m'aider ce serait vraiment sympa surtout que je suis complètement perdu ... Merci d'avance :)

(note : quand je fais INTO replique, ca crée automatiquement la table réplique ?)

3 réponses

Messages postés
3
Date d'inscription
lundi 4 décembre 2000
Statut
Membre
Dernière intervention
3 avril 2008

Bon j'ai trouvé la solution :









SE contacts



SET






QUOTED_IDENTIFIER



ON

GO





SET






ANSI_NULLS



ON

GO





Create






procedure
Usp_EffaceDoubValeurs

asDECLARE


csr1

CURSOR



FORSELECT


Nom

,
Prénom

,



COUNT
(*)






FROM



dbo

.
Contacts




GROUP






BY
Nom

,
Prénom

HAVING



COUNT
(*)



>
1




FOR






READ
ONLY


DECLARE



@Col1

nvarchar
(
255

)

DECLARE



@Col2

nvarchar
(
255

)

DECLARE



@count

INTOPEN


csr1


FETCH



NEXT

FROM
csr1

INTO
@Col1

,
@Col2

,
@count


WHILE






@@FETCH_STATUS



<>



-
1


BEGIN


IF






@@FETCH_STATUS



<>



-
2


BEGIN


SET



@count

=
@count

-
1




SET






ROWCOUNT
@count


DELETE






FROM
dbo

.
Contacts




WHERE



Nom

=
@Col1

AND
Prénom

=
@Col2




END







FETCH



NEXT

FROM
csr1

INTO
@Col1

,
@Col2

,
@count


END







CLOSE



csr1


DEALLOCATE



csr1


SET






ROWCOUNT
0 GO



SET






QUOTED_IDENTIFIER



OFF

GO





SET






ANSI_NULLS



ON

GO

Seulement, il me vire pas les lignes semblables où j'ai une valeur null pour le prénom... Please help me :)
Messages postés
3
Date d'inscription
lundi 4 décembre 2000
Statut
Membre
Dernière intervention
3 avril 2008

Finalement il suffisait de mettre : ANSI_NULLS



OFF
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
98
Salut,

Ca serait peut être mieux d'éviter de se servir deSET ANSI_NULLS OFF, qui est amené à disparaitre (pas une mauvaise chose) et réécrire la requête en gardant à l'esprit que NULL n'est pas une valeur, et que NULL n'est pas égal à NULL
Voir [http://msdn2.microsoft.com/fr-fr/library/ms188795.aspx IS [NOT] NULL]

Et sinon évite aussi les caractères accentués et autres trucs exotiques dans les noms.

/*
coq
MVP Visual C#
CoqBlog
*/