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 :

dynamic sql : exécuter des commandes sql d'une table


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 93
    Points : 41
    Points
    41
    Par défaut dynamic sql : exécuter des commandes sql d'une table
    Bonjour,

    A l'aide de la requête ci-dessous, je construis des commandes select dans une table stmt.
    Comment puis-je exécuter ces commandes automatiquement?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    declare @sql varchar(max)
    declare @sql2 varchar(max)
    CREATE TABLE stmt (sql varchar(max) )
    set @sql = 'declare @sql varchar(max) select + ''SELECT * INTO '+ @SchDest + '.[''+TABLE_NAME+''] 
    '+' FROM ['+@Srvsource + '].'+ @Dbsource + '.' +@Schsource + '.[''+TABLE_NAME+''] ''
    ' + ' FROM ['+@Srvsource + '].'+ @Dbsource + '.INFORMATION_SCHEMA.TABLES '+' 
    WHERE TABLE_SCHEMA = '''+@Schsource+''' execute (@sql)'
    insert into stmt execute (@sql)
    select @sql2 = coalesce(@sql2, ';') + ' select sql from stmt '
    exec (@sql2)
    drop table stmt
    Voici une des commandes de la table stmt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * INTO VTEMP.[SLOTMH]    FROM [SRVRBSQL01\RAB].tst.VDD04.[SLOTMH]
    Merci

    Bon we

    Bibi

  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,

    Rien ne sert de stocker les instruction à stocker dans une variable de type table.
    Créez vos instructions dans une seule chaîne de type varchar(max), en les concaténant séparées par des point-virgules et éventuellement des GO.
    Exécutez ensuite directement cette chaîne

    @++

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 912
    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 912
    Points : 51 678
    Points
    51 678
    Billets dans le blog
    6
    Par défaut
    Non, pas de go !!!!!!

    A +

  4. #4
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 93
    Points : 41
    Points
    41
    Par défaut concaténation de chaine
    Bonjour,

    J'ai suivi vos conseils, mais même résultat, je génère bien les 800 select mais ils ne s'exécutent pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    declare @sql varchar(max)
     
    select @sql = coalesce(@sql, ';') + 'declare @sql varchar(max) select + ''SELECT * INTO '+ @SchDest + '.[''+TABLE_NAME+''] 
    '+' FROM ['+@Srvsource + '].'+ @Dbsource + '.' +@Schsource + '.[''+TABLE_NAME+''] ''
    ' + ' FROM ['+@Srvsource + '].'+ @Dbsource + '.INFORMATION_SCHEMA.TABLES '+' 
    WHERE TABLE_SCHEMA = '''+@Schsource+''' execute (@sql) '
    execute (@sql)
    Avez-vous une idée?

    Merci

    Bon we

    Bibi

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 912
    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 912
    Points : 51 678
    Points
    51 678
    Billets dans le blog
    6
    Par défaut
    Avez vous un serveur lié pour @Srvsource ?

    A +

  6. #6
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 93
    Points : 41
    Points
    41
    Par défaut Stored proc select into
    Merci, effectivement j'utilise un server lié j'ai trouvé une solution

    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
    ALTER PROCEDURE [dbo].[sp_copy_schemab]
    @Srvsource varchar (30), 
    @Dbsource varchar(30), 
    @Schsource varchar(30), 
    @DbDest varchar(30),
    @SchDest varchar (30)
    AS
     
    EXEC master.dbo.sp_addlinkedserver @server = @Srvsource, @srvproduct=N'SQL Server'
    /* For security reasons the linked server remote logins password is changed with ######## */
    EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=@Srvsource,@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
     
    EXEC master.dbo.sp_serveroption @server=@Srvsource, @optname=N'collation compatible', @optvalue=N'false'
     
    EXEC master.dbo.sp_serveroption @server=@Srvsource, @optname=N'data access', @optvalue=N'true'
     
    EXEC master.dbo.sp_serveroption @server=@Srvsource, @optname=N'dist', @optvalue=N'false'
     
    EXEC master.dbo.sp_serveroption @server=@Srvsource, @optname=N'pub', @optvalue=N'false'
     
    EXEC master.dbo.sp_serveroption @server=@Srvsource, @optname=N'rpc', @optvalue=N'true'
     
    EXEC master.dbo.sp_serveroption @server=@Srvsource, @optname=N'rpc out', @optvalue=N'true'
     
    EXEC master.dbo.sp_serveroption @server=@Srvsource, @optname=N'sub', @optvalue=N'false'
     
    EXEC master.dbo.sp_serveroption @server=@Srvsource, @optname=N'connect timeout', @optvalue=N'0'
     
    EXEC master.dbo.sp_serveroption @server=@Srvsource, @optname=N'collation name', @optvalue=null
     
    EXEC master.dbo.sp_serveroption @server=@Srvsource, @optname=N'lazy schema validation', @optvalue=N'false'
     
    EXEC master.dbo.sp_serveroption @server=@Srvsource, @optname=N'query timeout', @optvalue=N'0'
     
    EXEC master.dbo.sp_serveroption @server=@Srvsource, @optname=N'use remote collation', @optvalue=N'true'
     
    declare @sql varchar(max)
    declare @sql2 varchar(max)
    CREATE TABLE stmt (sql varchar(max) )
    set @sql = 'declare @sql varchar(max) select + ''SELECT * INTO '+ @SchDest + '.[''+TABLE_NAME+''] '
    set @sql=@sql+' FROM ['+@Srvsource + '].'+ @Dbsource + '.' +@Schsource + '.[''+TABLE_NAME+''] '''
    set @sql=@sql+' FROM ['+@Srvsource + '].'+ @Dbsource + '.INFORMATION_SCHEMA.TABLES '
    set @sql=@sql+' WHERE TABLE_SCHEMA = '''+@Schsource+''' execute (@sql)'
    insert into stmt execute (@sql)
    SELECT @sql2 = coalesce(@sql2, '') + CAST (sql AS VARCHAR(MAX)) + ';' from stmt
    print (@sql2)
    exec (@sql2)
    Bonne journée

    Bibi

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/10/2009, 09h02
  2. Réponses: 3
    Dernier message: 26/07/2009, 10h06
  3. Réponses: 3
    Dernier message: 20/12/2006, 17h59
  4. [A97] VBA : Commande sql pour insertion de champs dans une table
    Par JeremieT dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 27/07/2006, 13h12
  5. Réponses: 1
    Dernier message: 23/02/2005, 11h23

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