IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Procédure stockée SQL Server


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    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 : 7
    Points
    7
    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 : 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
    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

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

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

    et sinon :
    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...

  3. #3
    Membre actif
    Inscrit en
    Juin 2006
    Messages
    229
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 229
    Points : 265
    Points
    265
    Par défaut
    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 ?

    @+

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    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 : 7
    Points
    7
    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.

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

  6. #6
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 795
    Points : 3 173
    Points
    3 173
    Par défaut
    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.
    MCTS Database Development
    MCTS Database Administration

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    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 : 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
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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).

    @++

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    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 : 7
    Points
    7
    Par défaut
    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

  9. #9
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 795
    Points : 3 173
    Points
    3 173
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    MCTS Database Development
    MCTS Database Administration

  10. #10
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    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 !

    @++

  11. #11
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    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…
    Mon produit pour la gestion d'école: www.logicoles.com

  12. #12
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    La première proposition d'alassanediakite étant de loin la plus propre et la plus performante.

    @++

  13. #13
    Membre averti

    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 249
    Points : 357
    Points
    357
    Par défaut
    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...

  14. #14
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 795
    Points : 3 173
    Points
    3 173
    Par défaut
    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.
    MCTS Database Development
    MCTS Database Administration

  15. #15
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    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?
    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…
    Mon produit pour la gestion d'école: www.logicoles.com

  16. #16
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    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.

Discussions similaires

  1. Problème LIKE Procédure stocké SQL Server 2000
    Par Pilhole dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 18/02/2008, 09h24
  2. Procédures stockées SQL Server, récupération sous Delphi
    Par rophi dans le forum Bases de données
    Réponses: 10
    Dernier message: 03/12/2007, 14h48
  3. Réponses: 1
    Dernier message: 04/03/2007, 15h40
  4. [procédure stockée][SQL server]Extraction, réinsertion
    Par caelum dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/02/2006, 07h59
  5. Procédures stockées SQL Server compatibles avec MySQL ?
    Par Nen'S dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 24/01/2006, 19h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo