Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/12/2010, 17h08   #1
Candidat au titre de Membre du Club
 
Inscription : avril 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 60
Points : 14
Points : 14
Par défaut suppression de plusiers tables

Bonjour,

j'ai plein de tables temporaires qui commencent par TMP_ et j'aimerai toutes les supprimer avec un script du genre :
Code :
1
2
3
SELECT 'DROP TABLE ' + TABLE_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME LIKE 'tmp_%'
Celui-là me retourne des lignes comme ça :
Code :
1
2
3
DROP TABLE tmp_table1
DROP TABLE tmp_table2
DROP TABLE tmp_tablen
Comment pourrais-je exécuter le résultat retourné par la requête ?

Merci.
chochatown est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2010, 16h02   #2
Membre Expert
 
Homme
Développeur java, access, sql server
Inscription : octobre 2005
Messages : 851
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Développeur java, access, sql server
Secteur : Industrie

Informations forums :
Inscription : octobre 2005
Messages : 851
Points : 1 302
Points : 1 302
1) Il faut mettre ta requête "SELECT 'DROP TABLE ' + ... " dans un curseur
2) Tu ouvres ton curseur et stockes le texte composé dans une variable @MonDrop varchar(500)
3) Tu exécutes le texte contenu dans @MonDrop avec l'instruction EXEC(@MonDrop)
4) Tu passes à l'enregistrement suivant.

Si tu as des soucis avec la syntaxe, je te donnerai un coup de main.
__________________
D'abord qu'il marche. Ensuite qu'il soit rapide. Enfin qu'il soit agréable à utiliser.
First, make it work. Then, make it fast. Finally, make it user-friendly.
Erst, mach', dass es funktioniert. Dann, mach', dass es schnell geht, Zum Schluss mach' es benutzerfreundlich.
Népomucène est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2010, 17h57   #3
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Bonsoir,

Il n'y a pas besoin de curseurs pour faire cela. Une simple variable sql suffit.

Code :
1
2
3
4
5
6
DECLARE @sql VARCHAR(MAX)
SELECT @sql = 'DROP TABLE ' + TABLE_NAME + 'GO '
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME LIKE 'tmp_%';
 
EXEC(@sql);
++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 09h52   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par mikedavem Voir le message
Bonsoir,

Il n'y a pas besoin de curseurs pour faire cela. Une simple variable sql suffit.

Code :
1
2
3
4
5
6
DECLARE @sql VARCHAR(MAX)
SELECT @sql = 'DROP TABLE ' + TABLE_NAME + 'GO '
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME LIKE 'tmp_%';
 
EXEC(@sql);
++
@mikedavem : il me semble que ta requête ne supprimera qu'une seule table, à savoir celle de la dernière ligne renvoyée par la requete
Sur le même principe, je ferai plutôt :

Code sql :
1
2
3
4
5
6
7
8
 
DECLARE @sql VARCHAR(MAX) = ''
SELECT @sql += 'DROP TABLE ' + TABLE_NAME + '; 
'
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME LIKE 'tmp_%';
 
 EXEC(@sql);
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 09h58   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
D'ailleurs il faudrait plutôt utiliser INFORMATION_SCHEMA.TABLES à la place de INFORMATION_SCHEMA.COLUMNS

sinon vous aurez autant d'instructions DROP que de colonnes pour chaque table... :
Code sql :
1
2
3
4
5
6
7
8
 
DECLARE @sql VARCHAR(MAX) = ''
SELECT @sql += 'DROP TABLE ' + TABLE_NAME + '; 
'
  FROM INFORMATION_SCHEMA.TABLES
 WHERE TABLE_NAME LIKE 'tmp_%';
 
 EXEC(@sql);
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 10h56   #6
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Citation:
Envoyé par aieeeuuuuu Voir le message
@mikedavem : il me semble que ta requête ne supprimera qu'une seule table, à savoir celle de la dernière ligne renvoyée par la requete
Sur le même principe, je ferai plutôt :

Code sql :
1
2
3
4
5
6
7
8
 
DECLARE @sql VARCHAR(MAX) = ''
SELECT @sql += 'DROP TABLE ' + TABLE_NAME + '; 
'
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME LIKE 'tmp_%';
 
 EXEC(@sql);
Oui effectivement j'ai ete un peu rapide .. merci pour la correction .. il faut bien incrementer la variable a chaque fois .. et interroger la bonne vue de schema

Avec tout ca chochatown devrait pouvoir supprimer ses tables temporaires

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 15h52   #7
Candidat au titre de Membre du Club
 
Inscription : avril 2007
Messages : 60
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 60
Points : 14
Points : 14
Par défaut Resolu

Merciii pour vous,

exactement ca a bien fonctionner juste j'Ai fait ces deux petites modifications sur des fautes de frappe :


Code :
1
2
3
4
5
6
7
8
DECLARE @sql VARCHAR(MAX); 
SET @sql= '';
 
SELECT @sql =+ 'DROP TABLE ' + TABLE_NAME + ';'
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_NAME LIKE 'tmp_%';
 
 EXEC(@sql);
Merci Bien
chochatown est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 16h20   #8
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
???

Quelles fautes de frappe ? Je vois trois différences entre les deux requetes :

1/ la declaration/initialisation des la variable @sql.
=> Les deux syntaxes se valent
2/ le retour chariot après le ';
=> c'est car au début je faisait un print pour voir le resultat, j'ai donc mis un saut de ligne pour que ça soit plus lisible, mais pour l'EXEC derreire, ca ne doit rien changer
3/ the last but not the least : le += transformé en =+
=> là par contre je ne comprend pas, vous devez à nouveau n'avoir que la dernière ligne prise en compte, et donc une seule table supprimée

D'autre part, vous avez à nouveau fait la requete sur la vue INFORMATION_SCHEMA.COLUMNS au lieu de INFORMATION_SCHEMA.TABLES

Effectivement, en raison du 3/ vous n'avez pas du avoir de message d'erreur, mais vous n'avez pas non plus supprimé toutes les tables. Si vous corrigez cette erreur (3/) par contre, vous devrez vous appuyer sur la bonne vue, sinon vous allez lancer plusieurs commande DROP sur la même table, et donc avoir une erreur...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 16h52   #9
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
INFORMATION_SCHEMA.COLUMNS view allows you to get information about all columns for all tables and views within a database

INFORMATION_SCHEMA.TABLES view allows you to get information about all tables and views within a database
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h00.


 
 
 
 
Partenaires

Hébergement Web