Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SQL SERVER 2005 - CREER DES INDEXES SUR UN CHAMP EXISTANT DANS TOUTES LES TABLES DE LA BASE


Information sur la source



Description

Dans certains cas, on peut trouver une conception des tables d'une base très générique (surtout en passant par un outil de génération automatique comme Hibernate ou Nhibernate). Ainsi, on peut vouloir optimiser la base en créant des indexes sur certains de ces champs génériques.
Ce script vous permet d'effectuer ce travail en testant l'existance et respectant les normes de nommage des indexes.

Il suffit donc de l'adapter à votre cas et à vos règles internes.
 

Source

  • -----------------------------------------------------------------
  • USE [MaDataBase]
  • -----------------------------------------------------------------
  • -- Spécification du champ qui doit être indexé
  • -----------------------------------------------------------------
  • DECLARE @NOM_CHAMP AS VARCHAR(50)
  • SET @NOM_CHAMP = 'MonNomDeChamp'
  • -----------------------------------------------------------------
  • DECLARE @TCompleteName AS VARCHAR(500)
  • DECLARE @SQL AS VARCHAR(MAX)
  • DECLARE @NomIDX AS VARCHAR(500)
  • -----------------------------------------------------------------
  • -- Déclaration du Curseur de sélection
  • -----------------------------------------------------------------
  • DECLARE TESTCURSEUR CURSOR
  • FOR SELECT
  • '[IDX_'+ UPPER(TAB.TABLE_NAME) +'_'+ UPPER(@NOM_CHAMP) +']' AS TIndex,
  • '['+ TAB.TABLE_SCHEMA +'].['+ TAB.TABLE_NAME +']' AS TCompleteName
  • FROM
  • INFORMATION_SCHEMA.COLUMNS COL
  • INNER JOIN INFORMATION_SCHEMA.TABLES TAB
  • ON (TAB.TABLE_SCHEMA = COL.TABLE_SCHEMA AND TAB.TABLE_NAME = COL.TABLE_NAME)
  • LEFT OUTER JOIN sys.sysindexes IDX
  • ON IDX.name = 'IDX_'+ UPPER(TAB.TABLE_NAME) +'_'+ UPPER(@NOM_CHAMP)
  • WHERE
  • COL.COLUMN_NAME = @NOM_CHAMP
  • AND
  • TAB.TABLE_TYPE = 'BASE TABLE'
  • AND
  • IDX.name IS NULL
  • -----------------------------------------------------------------
  • -- Déclaration du Curseur sur la liste des Bases de données
  • OPEN TESTCURSEUR
  • FETCH NEXT FROM TESTCURSEUR INTO @NomIDX, @TCompleteName
  • WHILE (@@FETCH_STATUS >= 0)
  • BEGIN
  • SET @SQL = 'CREATE NONCLUSTERED INDEX '+ @NomIDX +' ON '+ @TCompleteName +'(['+ @NOM_CHAMP +'] ASC) '
  • SET @SQL = @SQL +'WITH (STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, '
  • SET @SQL = @SQL +'IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) '
  • SET @SQL = @SQL +'ON [PRIMARY]'
  • EXECUTE (@SQL)
  • FETCH NEXT FROM TESTCURSEUR
  • INTO @NomIDX, @TCompleteName
  • END
  • -----------------------------------------------------------------
  • -- Fermeture du Curseur
  • CLOSE TESTCURSEUR
  • -- Libération de la mémoire prise par le Curseur
  • DEALLOCATE TESTCURSEUR
  • -----------------------------------------------------------------
-----------------------------------------------------------------
USE [MaDataBase]

-----------------------------------------------------------------
-- Spécification du champ qui doit être indexé
-----------------------------------------------------------------
DECLARE @NOM_CHAMP AS VARCHAR(50)
SET @NOM_CHAMP = 'MonNomDeChamp'

-----------------------------------------------------------------
DECLARE @TCompleteName AS VARCHAR(500)
DECLARE @SQL AS VARCHAR(MAX)
DECLARE @NomIDX AS VARCHAR(500)

-----------------------------------------------------------------
-- Déclaration du Curseur de sélection
-----------------------------------------------------------------
DECLARE TESTCURSEUR CURSOR 
   FOR SELECT 
	'[IDX_'+ UPPER(TAB.TABLE_NAME) +'_'+ UPPER(@NOM_CHAMP) +']' AS TIndex,
	'['+ TAB.TABLE_SCHEMA +'].['+ TAB.TABLE_NAME +']' AS TCompleteName
FROM 
	INFORMATION_SCHEMA.COLUMNS COL
INNER JOIN INFORMATION_SCHEMA.TABLES TAB
	ON (TAB.TABLE_SCHEMA = COL.TABLE_SCHEMA AND TAB.TABLE_NAME = COL.TABLE_NAME)
LEFT OUTER JOIN sys.sysindexes IDX
	ON IDX.name = 'IDX_'+ UPPER(TAB.TABLE_NAME) +'_'+ UPPER(@NOM_CHAMP)	
WHERE 
	COL.COLUMN_NAME = @NOM_CHAMP
AND
	TAB.TABLE_TYPE = 'BASE TABLE'
AND
	IDX.name IS NULL

-----------------------------------------------------------------
-- Déclaration du Curseur sur la liste des Bases de données 
OPEN TESTCURSEUR 
FETCH NEXT FROM TESTCURSEUR INTO @NomIDX, @TCompleteName 
   
WHILE (@@FETCH_STATUS >= 0)
	BEGIN 
		
		SET @SQL =  'CREATE NONCLUSTERED INDEX '+ @NomIDX +' ON '+ @TCompleteName +'(['+ @NOM_CHAMP +'] ASC) '
		SET @SQL = @SQL +'WITH (STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, '
		SET @SQL = @SQL +'IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = OFF) '
		SET @SQL = @SQL +'ON [PRIMARY]'

		EXECUTE (@SQL)

		FETCH NEXT FROM TESTCURSEUR 
		INTO @NomIDX, @TCompleteName 
	END

-----------------------------------------------------------------
-- Fermeture du Curseur 
CLOSE TESTCURSEUR 
  
-- Libération de la mémoire prise par le Curseur 
DEALLOCATE TESTCURSEUR

-----------------------------------------------------------------


Conclusion

Bon coding

Romelard Fabrice [MVP]
 

Commentaires et avis

Aucun commentaire pour le moment.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

création d'une automatique d'une base de données SQLServer [ par MokhTelnet ] bonjourj'ai besoin de savoir comment on peut créer une base de données SQLServer lors de l'installation d'une application.mon client ne veux se charge Commande DOS pour SQLServer 7 [ par MokhTelnet ] y a t'il une commande dos pour SQLSERVER 7 ?(comme la commande sqlplus pour oracle) création automatique d'une base de données SQLServer [ par MokhTelnet ] bonjour j'ai besoin de savoir comment on peut créer une base de données SQLServer lors de l'installation d'une application. mon client ne veux se char Problème SQLSERVER/php [ par LeJulius ] Je travaille actuellement sous SQL SERVER 2000 en lien avec du PHP 4.2.0 Mon problème est le suivant :Mes tables sql contiennent des caractères accent CREATION DE TYPE TABLE [ par AABS ] Bonjour tout le mondeje travaille sous SQL* Plus (de Oracle 8i)et j'ai fait les instructions suivantes:CREATE TYPE ADRESSE AS OBJECT (RUE CHAR(20),VIL creation d'index sous ms sql serveur ? [ par jimmy69 ] Bonjour a tous, Mes tables sont presque crees sous ms sql serveur 2000...J'avais lu un article sur l'utilite de la creation d' index ...sur les tables probleme de creation de requete sql server [ par firas_tn ] Bonjour a tous je suis débutant en sql server, j'ai une base de donnée en sql server et une table qui m'intéresse ou il ya beaucoup de Sauvegarde automatique sqlserver 2000 [ par jojos89 ] Salut a tous,J'ai une base de données en local sur mon pc (avec sqlserver 2000)que je voudrais sauvegardé automatique (tous les soir) s aide pour SQLSERVER [ par nagrom_om ] salut,quelqu'un sait il comment peut on avoir un listing des requetes qui sont passées sous SQL Server ??Merci ! ms access - sqlserver - procédurestockée [ par metasky ] bonjour,je suis actuellement sur une appli liant access et sqlserver...quand je consulte mes procédures stockées dans mon projet access les


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,546 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.