Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/04/2011, 13h07   #1
Invité de passage
 
Femme
Étudiant
Inscription : avril 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : avril 2011
Messages : 5
Points : 0
Points : 0
Par défaut Procédure stockée SQL Server

Je veux créer une procédure stockée pour rendre la saisie d'un champs obligatoire. Voici ma procédure, mais, elle marche pas veuillez m'aider SVP:

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
USE [KIMOCE]
GO
/****** Objet :  StoredProcedure [dbo].[CTC_TEST]    Date de génération du script : 01/04/2011 08:44:41 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[CTC_TEST]  
AS
 
DECLARE @DstCtcDsc VARCHAR(71)
DECLARE RqtEvent_Cursor CURSOR FOR 
SELECT DstCtcDsc
FROM p_rqt
WHERE RqtInCde > 0 
 
OPEN CtcEvent_Cursor 
FETCH NEXT FROM CtcEvent_Cursor INTO @DstCtcDsc
WHILE @@FETCH_STATUS = 0 
BEGIN
-- Recherche des demandes à traiter
IF @DstCtcDsc IS NULL
GOTO LBL_ERROR 
 
LBL_ERROR: 
RAISERROR('Contact obligatoire',11,2) WITH SETERROR 
END
kFedali est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 13h31   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Heu... il manque a un bout de la SP la non (sinon c'est normal qu'elle ne fonctionne pas ) ?

et sinon :
Citation:
mais, elle marche pas
c'est dire ? postez le message d'erreur.

Avec seulement la moitié de la SP, et sans message d'erreur, cela va etre difficile de vous aider...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 13h32   #3
Membre actif
 
Inscription : juin 2006
Messages : 161
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 161
Points : 154
Points : 154
Bonjour,

Oubliez les curseurs, ce n'est pas comme ça qu'on programme en SQL.
Pourquoi ne pas rendre NOT NULLABLE la colonne qui vous intéresse ?

@+
Zabriskir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 14h03   #4
Invité de passage
 
Femme
Étudiant
Inscription : avril 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : avril 2011
Messages : 5
Points : 0
Points : 0
Par défaut Réponse SQL Server

J'ai pas d'erreur, mais j'arrive pas à contrôler le champs.
Je travail sur un outil dont j'ai pas le code source mais ilest paramétrable et je peux contrôler le champs par une procédure stockée.
kFedali est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 14h35   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
je ne comprend pas bien

vous lancez la procédure tel quel ? avez vous posté la totalité de la procédure ?

il est normal qu'elle vous remonte tout le temps une erreur, il y a un RAISERRROR sur le chemin de code.

pourquoi utiliser un GOTO ?

pourquoi ne pas faire simplement
Code SQL :
1
2
3
 
IF @DstCtcDsc IS NULL
RAISERROR('Contact obligatoire',11,2) WITH SETERROR

Sinon mettez un autre GOTO devant votre label LBL_ERROR pour éviter que le raiserror ne soit exécuté s'il n'y a pas d'erreur...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 14h38   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
J'ai pas d'erreur, mais j'arrive pas à contrôler le champs.
Je travail sur un outil dont j'ai pas le code source mais ilest paramétrable et je peux contrôler le champs par une procédure stockée.
Il n'y a pas de champs dans une base de données mais des colonnes...

Vous voulez seulement contrôler lors de vos UPDATE/INSERT si la colonne est bien renseignée?

Si c'est le cas et que vous ne pouvez modifier la structure de la table (CONTRAINTE NOT NULL sur la colonne...) passez par des TRIGGERS.
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 14h41   #7
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Bonjour,

Citation:
J'ai pas d'erreur, mais j'arrive pas à contrôler le champs.
C'est normal, il manque le FETCH dans la boucle.
Pour le faire fonctionner il aurait fallu écrire :

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
ALTER PROCEDURE [dbo].[CTC_TEST]
AS
 
	DECLARE @DstCtcDsc VARCHAR(71)
 
	DECLARE RqtEvent_Cursor CURSOR FOR
		SELECT DstCtcDsc
		FROM p_rqt
		WHERE RqtInCde > 0
 
	OPEN CtcEvent_Cursor
	FETCH NEXT FROM CtcEvent_Cursor INTO @DstCtcDsc
	WHILE @@FETCH_STATUS = 0
	BEGIN
		-- Recherche des demandes à traiter
		IF @DstCtcDsc IS NULL
		GOTO LBL_ERROR
 
		LBL_ERROR:
		RAISERROR('Contact obligatoire',11,2) WITH SETERROR
 
		-- FETCH MANQUANT !
		FETCH NEXT FROM CtcEvent_Cursor INTO @DstCtcDsc
	END
	CLOSE CtcEvent_Cursor
	DEALLOCATE CtcEvent_Cursor
L'indentation n'a rien à voir, c'est juste pour la lisibilité.
Vous noterez de plus que vous ne dés-allouez pas le curseur (CLOSE + DEALLOCATE).

Oubliez les curseurs.
SQL est un langage ensembliste, donc il est conçu pour traiter très rapidement les données dans leur ensemble, et pas dans leur unité.

Pareil pour les LBL_ERROR: et les GOTO : c'est vieux et moche.
Vous auriez pu donc écrire, avec votre curseur :

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
ALTER PROCEDURE [dbo].[CTC_TEST]
AS
BEGIN
	SET NOCOUNT ON
 
	DECLARE @DstCtcDsc varchar(71)
 
	DECLARE RqtEvent_Cursor CURSOR FOR
		SELECT	DstCtcDsc
		FROM	p_rqt
		WHERE	RqtInCde > 0
 
	OPEN CtcEvent_Cursor
	FETCH NEXT FROM CtcEvent_Cursor INTO @DstCtcDsc
	WHILE @@FETCH_STATUS = 0
	BEGIN
		-- Recherche des demandes à traiter
		IF @DstCtcDsc IS NULL
		BEGIN
			RAISERROR('Contact obligatoire',11,2) WITH SETERROR
			RETURN
		END
	END
	CLOSE CtcEvent_Cursor
	DEALLOCATE CtcEvent_Cursor
END
Je ne vois pas non plus l'intérêt sur SETERROR pour le RAISERROR.

Je pense que c'est ce qu'il vous faut plutôt :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ALTER PROCEDURE [dbo].[CTC_TEST]
AS
BEGIN
	IF EXISTS
	(
		SELECT	*
		FROM	dbo.p_rqt
		WHERE	RqtInCde > 0
		AND	DstCtcDsc IS NULL
	)
	BEGIN
		RAISERROR('Contact obligatoire', 16, 1)
	END
END
Ici la table p_rqt est recherchée selon le filtre.
Si au moins une ligne correspond, ce que SQL Server peut savoir très vite si votre table est bien indexée, l'erreur est levée.

Dans votre cas vous parcourez, un à un, les lignes de votre curseur, en espérant trouver un DstCtcDsc à NULL.

Autrement dit vous tournez encore les pages pour trouver celle qu'il vous faut, alors que je suis déjà en train de la lire !

SQL est aussi un langage déclaratif : vous dites ce que vous voulez obtenir, pas la façon dont vous voulez l'obtenir (comme dans un langage fonctionnel).

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 16h26   #8
Invité de passage
 
Femme
Étudiant
Inscription : avril 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Femme

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : avril 2011
Messages : 5
Points : 0
Points : 0
Je vais vous expliquer ce que je veux faire:
J'ai un outil de gestion qui permet de créer des demandes clients. Lors de la création d'une demande je veux obliger l'utilisateur à saisir un champs qui n'est pas obligatoire par défaut. L'outil me permer d'associer une procédure stockée à ce champs. C'est pourquoi en fait j'ai décider de faire ça.
Donc, comment faire, je suis vraiment perdue
kFedali est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 16h47   #9
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Pouvez vous passer la valeur qui va être insérée dans de la colonne en paramètre de cette procédure stockée?
Si oui rien de plus simple:
Code :
1
2
3
4
5
6
ALTER PROCEDURE [dbo].[CTC_TEST] (@VALUE VARCHAR(50))
AS
BEGIN
   IF @VALUE IS NULL OR LEN(LTRIM(RTRIM(@VALUE)))=0
       RAISERROR('Contact obligatoire',11,2)
END
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 08h07   #10
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Non seulement ce devrait être implémenté comme vous le propose iberserk, mais vous devriez réaliser en plus ce contrôle côté applicatif !

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 11h10   #11
Membre chevronné
 
Avatar de alassanediakite
 
Homme Alassane Diakité
Conseil - Consultant en systèmes d'information
Inscription : août 2006
Messages : 539
Détails du profil
Informations personnelles :
Nom : Homme Alassane Diakité
Âge : 34
Localisation : Mali

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information

Informations forums :
Inscription : août 2006
Messages : 539
Points : 604
Points : 604
Envoyer un message via Yahoo à alassanediakite
Salut
Pour rendre obligatoire un champs d'une table vous avez deux choix:
  1. mettre "not null" dans la définition du champ (lors de create/alter table)
  2. ou faire un trigger qui vérifie le champ avant (instead of) insert ou update
Les procédures stockées sont faits pour des taches répétitives.
Bonne recherche
__________________
Le monde est trop bien programmé pour être l’œuvre du hasard…
alassanediakite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 11h49   #12
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
La première proposition d'alassanediakite étant de loin la plus propre et la plus performante.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 11h55   #13
Membre confirmé
 
Emmanuel CHONION
Inscription : novembre 2006
Messages : 229
Détails du profil
Informations personnelles :
Nom : Emmanuel CHONION
Âge : 43
Localisation : France, Marne (Champagne Ardenne)

Informations forums :
Inscription : novembre 2006
Messages : 229
Points : 298
Points : 298
Est-ce que l'outil de gestion permet de définir ou même d'imposer un paramètre à la procédure stockée associée à ton champ ?

Ca peut sembler étrange de vérifier toute la table pour une seule entrée...

Je pense que ce genre de contrôle est destiné à implémenter des règles de gestion spécifiques.

Donc on a besoin de la valeur...
EMC51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 14h22   #14
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
La première proposition d'alassanediakite étant de loin la plus propre et la plus performante.

@++
A priori il ne peux pas modifier la structure des tables?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 14h55   #15
Membre chevronné
 
Avatar de alassanediakite
 
Homme Alassane Diakité
Conseil - Consultant en systèmes d'information
Inscription : août 2006
Messages : 539
Détails du profil
Informations personnelles :
Nom : Homme Alassane Diakité
Âge : 34
Localisation : Mali

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information

Informations forums :
Inscription : août 2006
Messages : 539
Points : 604
Points : 604
Envoyer un message via Yahoo à alassanediakite
Salut
Comment voulez-vous qu'une PS vérifie un champ?
Supposons que l'outil (mais de quel outil s'agit-il?) permet d'associer un évènement (après mise à jour par exemple) au champ ciblé: on appelle le PS et qui renvoi une erreur, erreur qu'il va falloir capter et interpréter dans l'outil.
Ma question est: si l'outil permet d'associer des évènement à un champ (je ne voie pas comment le faire autrement!!!), pourquoi ne pas laisser l'outil gérer le contenu du champ? autant que je sache, les PS s'executent sur le serveur?
Citation:
A priori il ne peux pas modifier la structure des tables?
... s'il peut lancer des PS qu'est ce qui l'empêche d'en faire un avec alter table...?
@+
__________________
Le monde est trop bien programmé pour être l’œuvre du hasard…
alassanediakite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 10h33   #16
Membre chevronné
 
Avatar de Oliv-
 
Inscription : mars 2006
Messages : 643
Détails du profil
Informations personnelles :
Âge : 41

Informations forums :
Inscription : mars 2006
Messages : 643
Points : 699
Points : 699
Citation:
Envoyé par kFedali Voir le message
Je veux créer une procédure stockée pour rendre la saisie d'un champs obligatoire. Voici ma procédure, mais, elle marche pas veuillez m'aider SVP:
As tu un exemple d'une ps proposée par l'éditeur et qui fonctionne, ce sera peut être plus simple d'en comprendre l'utilité et le fonctionnement.
Oliv- est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h12.


 
 
 
 
Partenaires

Hébergement Web