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 18/05/2011, 14h51   #1
Invité régulier
 
Homme Christophe Rahier
Ingénieur systèmes et réseaux
Inscription : mai 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Homme Christophe Rahier
Localisation : Belgique

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mai 2011
Messages : 9
Points : 8
Points : 8
Par défaut Création d'un script, je ne sais pas comment l'aborder

Bonjour,

Je dois réaliser un script mais je ne sais pas comment l'aborder.

En fait, sur mon serveur, j'ai plusieurs DB.

Ce que j'aimerais c'est parcourir toutes les DB dont le nom contient "logs", j'ai donc fait ceci :
Code :
1
2
3
declare @DB_name varchar(128), @Table_name  varchar(128);
 
SELECT  @DB_name = name FROM sys.DATABASES WHERE name LIKE '%logs%'
Maintenant, dans chaque DB, je dois lister les tables, je suis parti sur cette idée :
Code :
1
2
3
4
5
6
USE @DB_name;
 
SELECT name 
FROM sys.objects WHERE type_desc = 'USER_TABLE'
AND name <> '_modele'
ORDER BY name
Dans chaque table, je voudrais lancer un ordre SQL effectuer différents.traitements.

Maintenant, je ne sais pas comment imbriquer tout ça, je ne vois pas comment faire les boucles puis un "USE" pour dire dans quelle DB je vais agir.

Je suis perdu!

Merci d'avance pour votre aide,

Christophe
qualifio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 15h11   #2
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
Bonjour,


Dans votre premier bout code, si votre requête vous renvoi plusieurs lignes (plusieurs nom de BDD contenant "logs"), votre variable se verra affecter un et un seul nom. Vous ne devez pas utiliser un VARCHAR.

Il y a plusieurs approches pour ce que vous semblez vouloir faire, pourriez vous préciser le type de traitement que vous voulez effectuer, ça nous aidera à vous orienter vers une solution adaptée.
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 15h22   #3
Invité régulier
 
Homme Christophe Rahier
Ingénieur systèmes et réseaux
Inscription : mai 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Homme Christophe Rahier
Localisation : Belgique

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mai 2011
Messages : 9
Points : 8
Points : 8
Bonjour,

J'avoue que je cherche dans tous les sens mais je n'ai pas l'habitude :-(

En fait, pour chaque table de chaque DB, je dois supprimer les records qui seraient des doublons.

J'ai une requête qui le fait :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DELETE
FROM   matable_01
WHERE  matable_01.id > ANY
   (SELECT id
    FROM   matable_01 T2
    WHERE  matable_01.id <> T2.id
      AND  matable_01.id_partie    = T2.id_partie
      AND  matable_01.ip    = T2.ip
      AND  matable_01.dataset    = T2.dataset
      AND  matable_01.ordre    = T2.ordre
      AND  matable_01.id_question    = T2.id_question
      AND  matable_01.reponse    = T2.reponse
      AND  matable_01.correct    = T2.correct
      AND  matable_01.score    = T2.score
 )
Est-ce plus clair ?

Merci,

Christophe
qualifio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 15h37   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Evitez d'utiliser les vues systèmes elle ne présentent pas toute l'information et sont complexes à manipuler. Utilisez les vues de la norme SQL INFORMATION_SCHEMA.
En particulier dans INFORMATION_SCHEMA.TABLES vous aurez la liste des tables de chaque base avec le nom de la base et le préfixe de schéma.
Pour voir comment traiter toutes les bases d'un coup jettez un coup d'oeil à la procédure SP_SEARCH_STRING_ANYFIELD_ANYTABLE que j'ai écrit ici : http://sqlpro.developpez.com/cours/s...r/transactsql/
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 15h46   #5
Invité régulier
 
Homme Christophe Rahier
Ingénieur systèmes et réseaux
Inscription : mai 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Homme Christophe Rahier
Localisation : Belgique

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mai 2011
Messages : 9
Points : 8
Points : 8
Bonjour,

Merci pour votre réponse.

Cependant, ce que j'aimerais faire est-il réalisable directement en SQL ou faut-il écrire une petite application pour cela ?

Tout ça est très nébuleux pour moi.

Christophe
qualifio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 18h34   #6
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
C'est possible en TSQL

ce bout de code devrait écrire vos requetes pour toutes les tables de la base sur laquelle vous êtes connecté.

Je fais un print, mais vous pouvez faire un sp_executesql.

Avec un curseur, vous pouvez le faire sur toutes vos BDD...

Attention, ce type d’opération peut toutefois mettre à mal votre serveur si vous avez de grosse tables, et que vous n'avez pas les index nécessaires, c'est donc a compléter et a tester avant de lancer ça en prod

D'autre part, pour simplifier l'exemple, j'ai considéré que la première colonne de chaque table était la clef primaire, mais il faudrait modifier le ORDER BY en fonction de vos vraies clefs primaires, que vous trouverez dans INFORMATION_SCHEMA.TABLE_CONSTRAINTS...

bref, c'est un début, à vous de jouer

Code SQL :
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
 
DECLARE @sql VARCHAR(MAX) = ''
DECLARE @TABLE SYSNAME
 
 
SELECT 
	@sql +=
		CASE WHEN TABLE_NAME = @TABLE --colonne suivante
			THEN CHAR(13)  + CHAR(9) + CHAR(9) + 'AND  ' + TABLE_NAME + '.' + COLUMN_NAME + ' = T2.' + COLUMN_NAME
			ELSE --table suivante
				CASE WHEN @sql = '' 
					THEN '' --premiere table
					ELSE ');' + CHAR(13) + CHAR(13) --table suivante : on termine la requete precedente, et on passe à la suivante...
			    END 
			    + 'DELETE FROM ' + TABLE_NAME + CHAR(13) 
			    + 'WHERE ' + COLUMN_NAME + ' > ANY ( ' 
			    + CHAR(13) + CHAR(9) + 'SELECT ' + COLUMN_NAME 
			    + CHAR(13) + CHAR(9) + 'FROM ' + TABLE_NAME + ' T2 ' 
			    + CHAR(13) + CHAR(9) + 'WHERE ' + TABLE_NAME + '.' + COLUMN_NAME + ' <> T2.' + COLUMN_NAME
		END,
	@TABLE = TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
ORDER BY TABLE_NAME, ORDINAL_POSITION
 
 
PRINT @sql
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 19h01   #7
Invité régulier
 
Homme Christophe Rahier
Ingénieur systèmes et réseaux
Inscription : mai 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Homme Christophe Rahier
Localisation : Belgique

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mai 2011
Messages : 9
Points : 8
Points : 8
En effet, je vais repasser sur les différentes DB pour voir si tout est OK.

Je débarque dans le projet, je ne suis pas le concepteur des DB ni des tables, pas toujours facile de s'y retrouver.

Merci pour l'aide en tout cas, je vais tester dans un environnement de test !
qualifio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 11h23   #8
Invité régulier
 
Homme Christophe Rahier
Ingénieur systèmes et réseaux
Inscription : mai 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Homme Christophe Rahier
Localisation : Belgique

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mai 2011
Messages : 9
Points : 8
Points : 8
Bonjour,

Le script est génial, merci beaucoup.

Mais dans l'hypothèse ou ma comparaison pour le delete des doublons ne se fait pas sur tout les champs mais sur une certaine partie, puis-je "exclure" des champs de la liste ?

Christophe
qualifio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 14h31   #9
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
Oui, vous pouvez ajouter un filtre à la requête pour ne pas prendre en compte ces colonnes.

sur le principe :
Code SQL :
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
 
DECLARE @sql VARCHAR(MAX) = ''
DECLARE @TABLE SYSNAME
 
;WITH Exclusion(T, C) AS (
    SELECT 'MaTable', 'UneColonne' UNION ALL
    SELECT 'MaTable', 'UneAutreColonne' UNIONN ALL
    SELECT 'UneAutreTable', 'Colonne'
)
SELECT 
	@sql +=
		CASE WHEN TABLE_NAME = @TABLE --colonne suivante
			THEN CHAR(13)  + CHAR(9) + CHAR(9) + 'AND  ' + TABLE_NAME + '.' + COLUMN_NAME + ' = T2.' + COLUMN_NAME
			ELSE --table suivante
				CASE WHEN @sql = '' 
					THEN '' --premiere table
					ELSE ');' + CHAR(13) + CHAR(13) --table suivante : on termine la requete precedente, et on passe à la suivante...
			    END 
			    + 'DELETE FROM ' + TABLE_NAME + CHAR(13) 
			    + 'WHERE ' + COLUMN_NAME + ' > ANY ( ' 
			    + CHAR(13) + CHAR(9) + 'SELECT ' + COLUMN_NAME 
			    + CHAR(13) + CHAR(9) + 'FROM ' + TABLE_NAME + ' T2 ' 
			    + CHAR(13) + CHAR(9) + 'WHERE ' + TABLE_NAME + '.' + COLUMN_NAME + ' <> T2.' + COLUMN_NAME
		END,
	@TABLE = TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS I
WHERE NOT EXISTS (
    SELECT *
    FROM Exclusion E
    WHERE E.T = I.TABLE_NAME 
        AND E.C = I.COLUMN_NAME
)
ORDER BY TABLE_NAME, ORDINAL_POSITION
 
 
PRINT @sql
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2011, 14h39   #10
Invité régulier
 
Homme Christophe Rahier
Ingénieur systèmes et réseaux
Inscription : mai 2011
Messages : 9
Détails du profil
Informations personnelles :
Nom : Homme Christophe Rahier
Localisation : Belgique

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mai 2011
Messages : 9
Points : 8
Points : 8
Merci beaucoup, je ne connaissais pas ce système pour exclure des champs.
qualifio est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h41.


 
 
 
 
Partenaires

Hébergement Web