[英]Convert SQL script to work on parallel data warehouse
I have SQL script which when executed runs on all database, Get list of all Tables with record count and Index created on that Table. 我有一个SQL脚本,当在所有数据库上运行该脚本时,获取具有记录计数的所有表的列表以及在该表上创建的索引。
However when I try to run that on parallel data warehouse server , Its giving me error. 但是,当我尝试在并行数据仓库服务器上运行它时,它给了我错误。 Because parallel data warehouse doesn't allow you to create temporary table variable,variables etc.
因为并行数据仓库不允许您创建临时表变量,变量等。
I have found alternative for table variable but didn't find anything about declaring varchar variables and then major concern is the way script is using database as variable in order to run the script on all database.I didn't find anything alternative of this. 我找到了表变量的替代方法,但没有发现有关声明varchar变量的任何信息,然后主要关注的是脚本将数据库用作变量的方式以便在所有数据库上运行脚本。我没有找到任何替代方法。
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
Now How can I make this work in parallel data warehouse 现在如何在并行数据仓库中进行这项工作
您可以使用未记录的sp_MSforeachdb过程在每个数据库上执行脚本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.