J'ai un script SQL qui, lorsqu'il est exécuté, s'exécute sur toutes les bases de données, Obtenir la liste de toutes les tables avec nombre d'enregistrements et index créés sur cette table.Convertir le script SQL pour travailler sur l'entrepôt de données parallèle
Cependant quand j'essaye de courir cela sur le serveur parallèle d'entrepôt de données, C'est me donner l'erreur. Parce que l'entrepôt de données parallèle ne vous permet pas de créer une variable de table temporaire, des variables etc.
J'ai trouvé une alternative pour la variable table mais je n'ai rien trouvé à propos de la déclaration des variables varchar, puis la principale préoccupation est la façon dont le script utilise la base de données comme variable afin d'exécuter le script sur toutes les bases de données. Je n'ai trouvé aucune alternative à cela.
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))
declare @DatabaseNames TABLE(Id INT IDENTITY(1,1),NameOfDataBase VARCHAR(100),DataBaseSize VARCHAR(100),Remarks VARCHAR(500))
declare @sql varchar(1000)
INSERT INTO @DatabaseNames
EXEC sp_databases
DECLARE @Count INT = 0,@Counter INT = 1 ,@NameOfDb VARCHAR(100);
SELECT @Count = COUNT(1) FROM @DatabaseNames
WHILE(@Count > 0)
BEGIN
SELECT @NameOfDb = NameOfDataBase FROM @DatabaseNames WHERE Id = @Counter
SET @sql = N'SELECT '''+ @NameOfDb +''',T.name AS [TABLE NAME],
I.rows AS [ROWCOUNT]
FROM @NameOfDb.sys.tables AS T
INNER JOIN @NameOfDb.sys.sysindexes AS I
ON T.object_id = I.id
AND I.indid < 2
ORDER BY I.rows DESC';
SET @sql = REPLACE(@sql, '@NameOfDb', @NameOfDb)
INSERT INTO @TableList(DataBaseName,TableName,RecordCount)
exec(@sql);
SET @sql = N'SELECT
'''+ @NameOfDb +''',
TableName = t.name,
IndexName = ind.name,
ind.type_desc
FROM
@NameOfDb.sys.indexes ind
INNER JOIN
@NameOfDb.sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_id
INNER JOIN
@NameOfDb.sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id
INNER JOIN
@NameOfDb.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 @sql = REPLACE(@sql, '@NameOfDb', @NameOfDb)
INSERT INTO @TableListWithIndex(DataBaseName,TableName,NameOfIndex,TypeOfIndex)
exec(@sql);
SET @Count = @Count - 1;
SET @Counter = @Counter + 1;
END
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
Where DataBaseName NOT IN ('tempdb','ReportServer$MSSQLSERVER2014TempDB','ReportServer$MSSQLSERVER2014','msdb','master','model')
order by DataBaseName
maintenant Comment puis-je faire ce travail dans l'entrepôt de données en parallèle