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 :

Utilisation d'une variable dans une condition While Exists


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 934
    Par défaut Utilisation d'une variable dans une condition While Exists
    Bonjour,
    je n'arrive pas à utiliser une variable dans une requête et je ne comprends pas où se trouve mon erreur.
    Selon que j'utilise la variable @ListeDesTablesAGérer ou que je spécifie "en dur", ma liste de valeurs, cela ne fonctionne pas avec ma variable et cela fonctionne avec ma liste en dur !!

    voici le code complet :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    Set NoCount ON
     
    Declare @schemaName varchar(200)
    set @schemaName=''
    Declare @constraintName varchar(200)
    set @constraintName=''
    Declare @tableName varchar(200)
    set @tableName=''
    Declare @Message nvarchar(max)
    Declare @Requete nvarchar(max)
    Declare @ListeDesTablesAGérer nvarchar(max)
     
     
    set @ListeDesTablesAGérer=''
    set @ListeDesTablesAGérer=@ListeDesTablesAGérer+'''Table1'','
    set @ListeDesTablesAGérer=@ListeDesTablesAGérer+'''Table2'','
    set @ListeDesTablesAGérer=@ListeDesTablesAGérer+'''Table3'''
     
    print @ListeDesTablesAGérer
     
    While exists
    (   
        SELECT c.name
        FROM sys.objects AS c
        INNER JOIN sys.tables AS t
        ON c.parent_object_id = t.[object_id]
        INNER JOIN sys.schemas AS s 
        ON t.[schema_id] = s.[schema_id]
        WHERE c.[type] IN ('D','C','F','PK','UQ','FK')
    	/*
    	Je ne comprends pas pourquoi la variable @ListeDesTablesAGérer n'est pas prise en compte !!!
    	*/
        --and t.name in(@ListeDesTablesAGérer)
        and t.name in('Table1','Table2','Table3')
        and c.name > @constraintName
    )
     
    Begin   
        SELECT 
            @constraintName=min(c.name)
        FROM sys.objects AS c
        INNER JOIN sys.tables AS t
        ON c.parent_object_id = t.[object_id]
        INNER JOIN sys.schemas AS s 
        ON t.[schema_id] = s.[schema_id]
        WHERE c.[type] IN ('D','C','F','PK','UQ','FK')
       	/*
    	Je ne comprends pas pourquoi la variable @ListeDesTablesAGérer n'est pas prise en compte !!!
    	*/
      --  and t.name in(@ListeDesTablesAGérer)
        and t.name in('Table1','Table2','Table3')
        and c.name > @constraintName
        SELECT 
            @tableName = t.name,
            @schemaName = s.name
        FROM sys.objects AS c
        INNER JOIN sys.tables AS t
        ON c.parent_object_id = t.[object_id]
        INNER JOIN sys.schemas AS s 
        ON t.[schema_id] = s.[schema_id]
        WHERE c.name = @constraintName
        set @Message='Suppression de la contrainte ' + @constraintName + ' de la table '+ @tableName +' ...'
        set @Requete= 'ALTER TABLE [' + @schemaName + N'].[' + @tableName + N'] DROP CONSTRAINT [' + @constraintName + ']'
        --exec sc_Admin.ps_ExecuteRequeteSQL @Requete,@Message
        print @message
        print @requete
    End
     
    Set NoCount OFF
    Je tourne en rond et je ne m'en sors pas.
    D'avance, merci pour vos lumières.

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    La chaîne que tu génères est :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    '''table1'',''table2'',''table3'''

    Donc dans la requête, ça donne :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    and t.name in('''table1'',''table2'',''table3''')

    Normale que ça ne fonctionne pas.

    SQL Server 2008R2 ne dispose pas de fonction de string_split native.
    Tu peux passer soit par un programme CLR (le plus performant), soit par une bidouille XML (illisible), soit une fonction T-SQL (le moins performant).
    Je te laisse chercher "sql server split" pour trouver des exemples et comparatifs.

    Autre solution :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    set @ListeDesTablesAGérer=''
    set @ListeDesTablesAGérer=@ListeDesTablesAGérer+'/Table1/,'
    set @ListeDesTablesAGérer=@ListeDesTablesAGérer+'/Table2/,'
    set @ListeDesTablesAGérer=@ListeDesTablesAGérer+'/Table3/'
     
    -- [...]
     
    and charindex(concat('/', t.name, '/'), @ListeDesTablesAGérer) > 0

    Accessoirement, évite de mettre des accents et autres caractères spéciaux dans tes noms de variables.
    Outre l'utilisation du français qui n'est pas évidente pour tout le monde, certains caractères ne sont pas aisément saisissables au clavier. Pense au petit indien qui va peut-être un jour te piquer ton travail et devoir maintenir ton code

    Ou imagine que les développeurs indiens de Microsoft utilisent l'hindi pour nommer les fonctions SQL...
    Je ne me vois pas taper "चुनते हैं" à la place de "select"

  3. #3
    Membre éprouvé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 934
    Par défaut Shame on me ...
    Merci d'avoir pris la peine de répondre.
    J'ai réalisé mon erreur et fait le même diagnostic que toi, mais un peu après ta réponse. Donc plus question de venir effacer cette question stupide. Si, si ... stupide.
    J'ai honte, j'ai très honte ... (pour copier une réplique des inconnus).

Discussions similaires

  1. Utiliser une valeur d'une variable dans une Macro
    Par ca_adrien dans le forum Macro
    Réponses: 7
    Dernier message: 01/08/2013, 14h14
  2. utilisation d'une variable d'une class dans une autre class
    Par the watcher dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2010, 14h01
  3. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  4. Réponses: 4
    Dernier message: 29/01/2008, 11h12
  5. Réponses: 1
    Dernier message: 15/02/2007, 00h24

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