J'essaye de construire une requête qui place sa sortie dans une table. L'exec (@inloop_query) ne connaît pas une table déclarée d'avant. (cette partie entre le ------------------ Est-ce possible ou dois-je essayer de faire quelque chose qui ne fonctionne pas? s'il vous plaît conseiller.La requête T-SQL a mal tourné exec pas dans la table
(l'erreur que j'ai est la suivante: doit déclarer la variable de table « @inloop_table » gravité 15 Etat 2)
DECLARE @frame_db_name VARCHAR(max)
DECLARE @frame_db_id INT
DECLARE @frame_table TABLE (
db_id INT ,
names VARCHAR(max))
DECLARE @frame_count INT
DECLARE @frame_count_max INT
SET @frame_count = 1
SET @frame_count_max = 0
SELECT @frame_count_max = count (name) FROM sys.databases WHERE Name LIKE 'B%' and state_desc = 'online'
INSERT INTO @frame_table SELECT database_id , name FROM sys.databases WHERE Name LIKE 'B%' and state_desc = 'online' ORDER BY database_id
DECLARE @inloop_query VARCHAR(max)
DECLARE @Inloop_table TABLE (
IL_SchemaName VARCHAR(max) ,
IL_TableName VARCHAR(max) ,
IL_IndexName VARCHAR(max) ,
IL_IndexID INT ,
IL_Fragment INT)
IF @frame_count_max <= 0
PRINT '@count_max (<=0) = ' + CAST(@frame_count_max AS VARCHAR)
ELSE
WHILE @frame_count <= @frame_count_max
BEGIN
SELECT @frame_db_name = names , @frame_db_id = db_id FROM @frame_table WHERE db_id IN (SELECT TOP 1 db_id FROM @frame_table ORDER BY db_id)
PRINT '@count_max (>=0) = ' + CAST(@frame_count_max AS VARCHAR)
PRINT '@count = ' + CAST(@frame_count AS VARCHAR(max))
PRINT 'current DB name = ' + CAST(@frame_db_name AS VARCHAR(max))
PRINT 'current DB ID = ' + CAST(@frame_db_id AS VARCHAR(max))
------------------------------------------------------------
SET @inloop_query = '
USE ' + CAST(@frame_db_name AS VARCHAR(max)) +
' INSERT INTO @inloop_table
SELECT SCHEMA_NAME(o.schema_id) AS SchemaName,
OBJECT_NAME(a.object_id) AS TableName,
i.name AS IndexName,
a.index_id AS IndexID,
convert(tinyint,a.avg_fragmentation_in_percent) AS [Fragment]
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL,NULL, ''LIMITED'') AS a
INNER JOIN sys.indexes i ON i.index_id = a.index_id
AND i.object_id = a.object_id
INNER JOIN sys.objects o ON a.object_id = o.object_id
ORDER BY SchemaName, TableName, IndexID'
EXEC(@inloop_query)
------------------------------------------------------------
SET @frame_count = @frame_count + 1
DELETE FROM @frame_table WHERE db_id IN (SELECT TOP 1 db_id FROM @frame_table ORDER BY db_id)
END
Merci pour votre repley. Je pensais à ça aussi mais le problème est que je ne peux pas faire de tables sur la BD sur laquelle je travaille. J'ai aussi essayé (et cela a fonctionné) de faire la TABLE dans @inloop_query mais j'ai besoin de la sortie dans un autre temps. J'espère vraiment qu'il y a un moyen de faire en sorte que cela fonctionne. – hexedecimal
Qu'en est-il alors de la solution de GarethD? –