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 :

[SQL Server 2005] Accès à une colonne dynamiquement ?


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 46
    Points
    46
    Par défaut [SQL Server 2005] Accès à une colonne dynamiquement ?
    Bonjour,

    J'ai un petit souci pour pouvoir accéder à une colonne initialisée dynamiquement avec une @variable

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    set @requete=' Select *
    From dbo.Rights
    Where [User_ID] = Upper('+@UserID+')
    And Lib_ID = '+@Lib+'
    And TypeDoc_ID = '+@TypeDoc+'
    And '+ @TypeDroit +' = true'
     
    exec sp_executesql @requete
    Quand je l'exécute j'ai cette erreur (En affectant la valeur Read à @TypeDroit en c#) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Msg*156, Niveau*15, État*1, Ligne*7
    Syntaxe incorrecte vers le mot clé 'Read'.
    Il prend en compte les ' ' que j'ai affecté dans ma requête (Sinon ça me dit que ma variable n'existe pas ...)


    J'ai recherché ici, sur d'autres sites, mais je n'ai pas trouvé la solution à mon problème (il y a juste la solution pour pouvoir créer une colonne dynamiquement, et non y accéder)


    Si quelqu'un pouvait m'aider ...
    Merci d'avance

  2. #2
    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 : 43
    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,

    Quel est le type de la colonne Read ?
    Si elle est de type VARCHAR ou CHAR, pourquoi ne pas avoir choisi BIT ?
    Si elle est de type BIT, vous devez remplacer 'true' par 1.

    N'utilisez pas * dans vos SELECT, c'est contre-performant.
    Spécifiez toutes les colonnes, même s'il s'agit de toutes les colonnes de la table cible.

    @++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par CTEMan Voir le message
    Bonjour,

    Quel est le type de la colonne Read ?
    Si elle est de type VARCHAR ou CHAR, pourquoi ne pas avoir choisi BIT ?
    Si elle est de type BIT, vous devez remplacer 'true' par 1.

    N'utilisez pas * dans vos SELECT, c'est contre-performant.
    Spécifiez toutes les colonnes, même s'il s'agit de toutes les colonnes de la table cible.

    @++

    Merci pour ta réponse tout d'abord.

    Type de ma colonne Read : bit
    J'ai remplacé 'true' par 1, mais ça ne change rien car la colonne est en bit, donc 1 = true, 0 = false.
    J'ai spécifié toutes les colonnes, je ne savais pas que c'était contre performant de mettre *

    J'ai toujours la même erreur cependant ...

  4. #4
    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 : 43
    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
    a colonne est en bit, donc 1 = true, 0 = false.
    Pas sûr que ça marche, mais si tu le dis ...
    Pourtant il me semble qu'on doit écrire CAST('true' AS BIT) par exemple ...

    Fais un PRINT @requete avant l'appel à sp_executeSQL pour voir la chaîne de requête que tu as construit

    @++

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 46
    Points
    46
    Par défaut
    Non pas besoin, j'ai déjà testé plusieurs fois, il ne fait pas la différence entre true / 1 et false / 0 quand la colonne est de type bit !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Select ID, User_ID, Lib_ID, TypeDoc_ID, Private_Level [Create], [Read], [Modify], [Suppress]
    From dbo.Rights
    Where [User_ID] = Upper(MON_ID)
    And Lib_ID = MA_LIBRAIRIE
    And TypeDoc_ID = MON_TYPE
    And Read = 1
     
    Msg*156, Niveau*15, État*1, Ligne*7
    Syntaxe incorrecte vers le mot clé 'Read'.
    Voilà ...
    Et quand je met des [ ] autour de ma variable @TypeDroit, ça me met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    Select ID, User_ID, Lib_ID, TypeDoc_ID, Private_Level, [Create], [Read], [Modify], [Suppress]
    From dbo.Rights
    Where [User_ID] = Upper(MON_ID)
    And Lib_ID = MA_LIBRAIRIE
    And TypeDoc_ID = MON_TYPE
    And [Read] = 1
     
    Msg*207, Niveau*16, État*1, Ligne*5
    Nom de colonne non valide*: 'MA_LIBRAIRIE'.
    Msg*207, Niveau*16, État*1, Ligne*6
    Nom de colonne non valide*: 'MON_TYPE'.

  6. #6
    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 : 43
    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 pas besoin, j'ai déjà testé plusieurs fois, il ne fait pas la différence entre true / 1 et false / 0 quand la colonne est de type bit !
    Ok, je tâcherai de m'en rappeler, il doit le caster automatiquement. Chanceux

    La seconde requête est correcte parce que READ comme vous le voyez par la coloration syntaxique est un mot clé T-SQL.
    Vous devez néanmois encadrer MA_LIBRAIRIE et MON_TYPE par des quote.
    Comme vous avez fait du SQL dynamique, vous devrez en mettre deux ou trois de part et d'autre de chacun de ces deux valeurs

    @++

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 46
    Points
    46
    Par défaut
    C'est ok, je viens de résoudre le problème, c'est bien à cause du 'Read' donc j'ai rajouté des [ ] comme j'avais fait, mais j'avais encore un souci ...

    Il faut mettre 3 ' à droite et à gauche de chaque variable représentant une donnée (et non une colonne) ... (Normalement 1 suffit, mais bon là, c'est à cause du SQL dynamique si j'ai bien compris lol)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    set @requete='
    Select *
    From dbo.Rights
    Where [User_ID] = Upper('''+@UserID+''')
    And Lib_ID = '''+@Lib+'''
    And TypeDoc_ID = '''+@TypeDoc+'''
    And ['+@TypeDroit+'] = 1'
     
    exec sp_executesql @requete
    Voilà la requête qui fonctionne

    Merci beaucoup CTEMan

  8. #8
    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 : 43
    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
    Marquez le sujet comme résolu

    @++

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

Discussions similaires

  1. [SQL SERVER 2005] Exporter une table en Access
    Par Golzinne dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/03/2007, 17h08
  2. [SQL SERVER 2005] Ouvrir une table en exclusif
    Par olbi dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 02/03/2007, 18h58
  3. [SQL SERVER 2005] Renvoyer une valeur
    Par diaboloche dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/02/2007, 11h18
  4. [SQL Server 2005] Recherche sur colonne "Image"
    Par frechy dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 01/09/2006, 18h35
  5. [SQL Server 2000] ajouter une colonne identité dans une vue?
    Par CetTer dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/08/2005, 13h43

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