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 :

Table paramteree dans un SELECT dans une stored procedure ? [2016]


Sujet :

Développement SQL Server

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut Table paramteree dans un SELECT dans une stored procedure ?
    Bonjour a tous et merci de votre temps et de votre aide.

    Je debute en MS SQL Server et j'ai une application avec 2 tables qui ont exactement les memes champs (note : je dois conserver les 2 tables).
    Quand j'interroge l'une generalement j'interroge l'autre.
    Dans une strored procdure voici que j'ai fait pour un de mes traitements.
    Ceci est un exemple mais j'ai le cas tres souvant dans mon appli.

    Code sql : 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
             SELECT 
    		T.Trip#, 
    		Cast(T.DatePosted as DATETIME) AS DateCriteria, 
    		(CASE WHEN C.[FollowUpNo] IS NULL AND T.[FollowUp_No]=0 THEN 2 -- It is a 0, so at least 2 notices have been sent
    		 ELSE CASE WHEN C.[Level] = 1 THEN 1 -- 1st specified follow up
    			  ELSE CASE WHEN C.[Level] > 1 THEN 2 -- 2nd or more specified follow up
    			       END
    			  END
    		 END) as NoticeNumber
    	FROM MY_DATA AS T 
    		LEFT JOIN #TEMP_Config as C 
    			ON T.[Region] =  C.[Region]
    			   AND T.[Application] = C.[Source]
    			   AND T.[FollowUp_No] = C.[FollowUpNo]
    	WHERE ISDATE(T.DatePosted)=1
    		  AND (CAST(T.DatePosted as DATETIME) BETWEEN @StartDate AND @EndDate)
    		  AND T.[FollowUp_No] IS NOT NULL

    Et la seule difference est ici :

    ou je vais changer les noms pour MY_DATA_AutreNom et actuellement ce que je fais c'est recopier le code et le modifier.

    Ce que j'aimerai et ce sans me retrouver avec une quirielle d'objets dans ma BD c'est avoir la possibilite de passer le nom de la table en parametre.

    Avoir quelque chose comme :

    Code sql : 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
             SELECT 
    		T.Trip#, 
    		Cast(T.DatePosted as DATETIME) AS DateCriteria, 
    		(CASE WHEN C.[FollowUpNo] IS NULL AND T.[FollowUp_No]=0 THEN 2 -- It is a 0, so at least 2 notices have been sent
    		 ELSE CASE WHEN C.[Level] = 1 THEN 1 -- 1st specified follow up
    			  ELSE CASE WHEN C.[Level] > 1 THEN 2 -- 2nd or more specified follow up
    			       END
    			  END
    		 END) as NoticeNumber
    	FROM {{{Ici_La_Table}}} AS T 
    		LEFT JOIN #TEMP_Config as C 
    			ON T.[Region] =  C.[Region]
    			   AND T.[Application] = C.[Source]
    			   AND T.[FollowUp_No] = C.[FollowUpNo]
    	WHERE ISDATE(T.DatePosted)=1
    		  AND (CAST(T.DatePosted as DATETIME) BETWEEN @StartDate AND @EndDate)
    		  AND T.[FollowUp_No] IS NOT NULL

    Que recommandez-vous ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Il faut faire du SQL dynamique

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour et merci de ta reponse.

    C'est ce que j'avais finalement trouve et j'ai aussi trouve un article deconseillant en termes clairs de faire cela :

    The Curse and Blessings of Dynamic SQL
    http://www.sommarskog.se/dynamic_sql.html

    Qu'en penses-tu ?

    J'avoue etre surpris que MS SQL Server repose sur un mecanisme aussi peu fiable, car tellement sujet aux erreurs humaines et non validable par le compilateur, que la composition de SQL par le code.
    Je travaillais majoritairement en Access ou ce genre de tour de passse passe est regulier mais tout le monde sait bien que Access n'est une "vraie" BDD :-) donc j'esperais quelque chose de plus sofistique dans MS SQL Server.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Il n'y a aucun danger à utiliser du SQL dynamique si tu en contrôle les valeurs des arguments passés.

    Dans ton cas c'est simple. Comme le paramètre est un nom de table (par exemple @TBL_SCH sysname , @TBL_NAME sysname), les premières lignes de ton code doivent être celles de contrôle, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    IF NOT EXISTS(SELECT * 
                  FROM   INFORMATION_SCHEMA.TABLES 
                  WHERE  TABLE_TYPE = 'BASE TABLE' AND 
                         TABLE_SCHEMA = @TBL_SCH AND 
                         TABLE_NAME = @TBL_NAME)
       RETURN;

    Ne jamais retourner un code d'erreur précis afin de luter efficacement contre les injection de SQL.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Ok, merci.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/02/2016, 12h36
  2. Réponses: 7
    Dernier message: 05/03/2009, 15h46
  3. Réponses: 4
    Dernier message: 15/04/2008, 17h41
  4. Réponses: 4
    Dernier message: 16/08/2007, 23h13
  5. Plusieurs SELECT dans l'ouverture d'une connection
    Par pmboutteau dans le forum ASP
    Réponses: 6
    Dernier message: 01/04/2005, 11h09

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