Requête SQL pour exécuter une requête sur toutes les bases de données

Je travaille sur un script dans lequel j'ai besoin d'get tous les loggings de table et l'index créé sur cette table pour toutes les bases de données sur le server. Je suis capable d'accomplir cette fonctionnalité mais j'ai dû mentionner le nom de database de façon statique.

Voici le script que j'utilise

declare @TableList TABLE(Id int IDENTITY(1,1),DataBaseName VARCHAR(100),TableName VARCHAR(100),RecordCount INT,NameOfIndex VARCHAR(100),TypeOfIndex VARCHAR(100)) declare @TableListWithIndex TABLE(Id int IDENTITY(1,1),DataBaseName VARCHAR(100),TableName VARCHAR(100),NameOfIndex VARCHAR(100),TypeOfIndex VARCHAR(100)) INSERT INTO @TableList(DataBaseName,TableName,RecordCount) SELECT 'DBNAME1',T.name AS [TABLE NAME], I.rows AS [ROWCOUNT] FROM DBNAME1.sys.tables AS T INNER JOIN DBNAME1.sys.sysindexes AS I ON T.object_id = I.id AND I.indid < 2 ORDER BY I.rows DESC INSERT INTO @TableListWithIndex(DataBaseName,TableName,NameOfIndex,TypeOfIndex) SELECT 'DBNAME1', TableName = t.name, IndexName = ind.name, ind.type_desc FROM DBNAME1.sys.indexes ind INNER JOIN DBNAME1.sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_id INNER JOIN DBNAME1.sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id INNER JOIN DBNAME1.sys.tables t ON ind.object_id = t.object_id WHERE ind.is_primary_key = 0 AND ind.is_unique = 0 AND ind.is_unique_constraint = 0 AND t.is_ms_shipped = 0 ORDER BY t.name, ind.name, ind.index_id, ic.index_column_id END --FOR DBNAME1 update TL SET TL.NameOfIndex = TLW.NameOfIndex,TL.TypeOfIndex = TLW.TypeOfIndex from @TableList TL INNER JOIN @TableListWithIndex TLW ON TL.TableName = TLW.TableName AND TL.DataBaseName = TLW.DataBaseName select * from @TableList order by Id 

SO pour Database2 J'ai dû écrire le code entier au-dessus de la déclaration de mise à jour .. afin d'get tous les loggings et le nom d'index de la database 2.

Mais comment je peux atteindre cette fonctionnalité de manière dynamic, où je n'ai pas besoin de coder en dur le nom de la database.

Merci d'avance

POUR MS SQL SERVER: j'ai essayé votre partie avec une table j'espère que vous allez exécuter dans la deuxième table aussi pour la requête dynamic nous devons sortir une instruction dans une variable et replace une string de cette variable puis l'exécuter

 declare @ds nvarchar(22); declare @qry nvarchar(max); set @ds = 'KaamKaaj'; set @qry = N' SELECT '''+ @ds + ''' as DBName , T.name AS [TABLE NAME], I.rows AS [ROWCOUNT] FROM @ds.sys.tables AS T INNER JOIN @ds.sys.sysindexes AS I ON T.object_id = I.id AND I.indid < 2 ORDER BY I.rows DESC'; SET @qry = REPLACE(@qry, '@ds', @ds) print @qry; declare @TableList TABLE(Id int IDENTITY(1,1),DataBaseName VARCHAR(100),TableName VARCHAR(100),RecordCount INT,NameOfIndex VARCHAR(100),TypeOfIndex VARCHAR(100)) INSERT INTO @TableList(DataBaseName,TableName,RecordCount) exec(@qry ); declare @qry2 nvarchar(max); set @qry2 = N'SELECT '''+ @ds + ''' as DBName, t.name, ind.name, ind.type_desc FROM @ds.sys.indexes ind INNER JOIN @ds.sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_id INNER JOIN @ds.sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id INNER JOIN @ds.sys.tables t ON ind.object_id = t.object_id WHERE ind.is_primary_key = 0 AND ind.is_unique = 0 AND ind.is_unique_constraint = 0 AND t.is_ms_shipped = 0 ORDER BY t.name, ind.name, ind.index_id, ic.index_column_id '; SET @qry2 = REPLACE(@qry2, '@ds', @ds) declare @TableListWithIndex TABLE(Id int IDENTITY(1,1),DataBaseName VARCHAR(100),TableName VARCHAR(100),NameOfIndex VARCHAR(100),TypeOfIndex VARCHAR(100)) INSERT INTO @TableListWithIndex(DataBaseName,TableName,NameOfIndex,TypeOfIndex) exec(@qry2 ); select * from @TableList select * from @TableListWithIndex 

Juste pour ne pas utiliser de loops que le code précédemment affiché serait une progression naturelle, je voulais mettre en place une approche non-boucle à ce type de chose. Notez que j'ai dû changer les types de données de votre table pour être sysname parce que 100 caractères ne sont pas assez longs dans certains cas. J'ai également utilisé une table temporaire à la place d'une variable de table, de sorte qu'elle sera disponible pour le SQL dynamic.

 if OBJECT_ID('tempdb..#TableList') is not null drop table #TableList create table #TableList ( Id int IDENTITY(1,1) , DataBaseName sysname , TableName sysname , RecordCount INT , NameOfIndex sysname , TypeOfIndex sysname ) declare @Database sysname declare @SQL nvarchar(max) = '' select @SQL = @SQL + 'SELECT ''' + name + ''', ' + 't.name collate SQL_Latin1_General_CP1_CI_AS, ' + 'ind.name collate SQL_Latin1_General_CP1_CI_AS, ' + 'ind.type_desc collate SQL_Latin1_General_CP1_CI_AS ' + 'FROM [' + name + '].sys.indexes ind ' + 'INNER JOIN [' + name + '].sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_id ' + 'INNER JOIN [' + name + '].sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id ' + 'INNER JOIN [' + name + '].sys.tables t ON ind.object_id = t.object_id ' + 'WHERE ' + 'ind.is_primary_key = 0 ' + 'AND ind.is_unique = 0 ' + 'AND ind.is_unique_constraint = 0 ' + 'AND t.is_ms_shipped = 0 ' + 'UNION ALL ' from sys.databases set @SQL = 'insert #TableList(DatabaseName, TableName, NameOfIndex, TypeOfIndex) ' + left(@SQL, LEN(@SQL) - 10) exec sp_executesql @SQL select * from #TableList order by DataBaseName, TableName, NameOfIndex