Sql server 跨多个SQL Server数据库计算行数
我试图从SQL Server实例中的每个数据库中计算所有名为tblDoc的表的行数 我尝试了这个方法,但显然您无法访问或声明游标中的变量:Sql server 跨多个SQL Server数据库计算行数,sql-server,Sql Server,我试图从SQL Server实例中的每个数据库中计算所有名为tblDoc的表的行数 我尝试了这个方法,但显然您无法访问或声明游标中的变量: DECLARE @dbname nvarchar(1000); DECLARE @sqlCommand NVARCHAR(1000) DECLARE @results TABLE(numberOfDocuments bigint); DECLARE c1 CURSOR READ_ONLY FOR SELECT '[' + name + ']' FROM
DECLARE @dbname nvarchar(1000);
DECLARE @sqlCommand NVARCHAR(1000)
DECLARE @results TABLE(numberOfDocuments bigint);
DECLARE c1 CURSOR READ_ONLY
FOR
SELECT '[' + name + ']' FROM sys.databases WHERE name <> 'tempdb'
OPEN c1
FETCH NEXT FROM c1
INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sqlCommand = 'INSERT INTO results SELECT COUNT(ID) FROM ' + @dbname + '.dbo.tblDoc;';
print @sqlCommand;
EXECUTE sp_executesql @sqlCommand
FETCH NEXT FROM c1
INTO @dbname
END
CLOSE c1
DEALLOCATE c1
SELECT COUNT(numberOfDocuments) from @results;
使用临时表代替
DECLARE @dbname nvarchar(1000);
DECLARE @sqlCommand NVARCHAR(1000)
CREATE TABLE #results (numberOfDocuments bigint);
DECLARE c1 CURSOR READ_ONLY
FOR
SELECT '[' + name + ']' FROM sys.databases WHERE name <> 'tempdb'
OPEN c1
FETCH NEXT FROM c1
INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sqlCommand = 'INSERT INTO #results SELECT COUNT(ID) FROM ' + @dbname + '.dbo.tblDoc;';
print @sqlCommand;
EXECUTE sp_executesql @sqlCommand
FETCH NEXT FROM c1
INTO @dbname
END
CLOSE c1
DEALLOCATE c1
SELECT COUNT(numberOfDocuments) from #results;
Raj改用临时表
DECLARE @dbname nvarchar(1000);
DECLARE @sqlCommand NVARCHAR(1000)
CREATE TABLE #results (numberOfDocuments bigint);
DECLARE c1 CURSOR READ_ONLY
FOR
SELECT '[' + name + ']' FROM sys.databases WHERE name <> 'tempdb'
OPEN c1
FETCH NEXT FROM c1
INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sqlCommand = 'INSERT INTO #results SELECT COUNT(ID) FROM ' + @dbname + '.dbo.tblDoc;';
print @sqlCommand;
EXECUTE sp_executesql @sqlCommand
FETCH NEXT FROM c1
INTO @dbname
END
CLOSE c1
DEALLOCATE c1
SELECT COUNT(numberOfDocuments) from #results;
Raj如果您要查找给定服务器中所有数据库中的所有表计数,则下面的解决方案非常简单
DECLARE @dbname nvarchar(1000);
DECLARE @sqlCommand NVARCHAR(1000)
drop table if exists ##temp
create table ##temp (dbname varchar(500),schemaname varchar(500),tablename varchar(500),counts int)
DECLARE c1 CURSOR READ_ONLY
FOR
SELECT name FROM master.sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb');
OPEN c1
FETCH NEXT FROM c1
INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sqlCommand = 'INSERT INTO ##temp'+'
SELECT
'''+@dbname+''' as databasename,
s.name AS schemaname,
t.name AS tablename,
p.rows AS rowcounts
FROM '+@dbname+'.sys.tables t
INNER JOIN '+@dbname+'.sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN '+@dbname+'.sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN '+@dbname+'.sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN '+@dbname+'.sys.schemas s ON t.schema_id = s.schema_id
WHERE t.NAME NOT LIKE ''dt%''
AND t.is_ms_shipped = 0
AND i.OBJECT_ID > 255
GROUP BY
t.name, s.name, p.Rows
'
;
print @sqlCommand;
EXECUTE sp_executesql @sqlCommand
FETCH NEXT FROM c1
INTO @dbname
END
CLOSE c1
DEALLOCATE c1
select * from ##temp
如果您要查找给定服务器中所有数据库中的所有表计数,那么下面的解决方案非常简单
DECLARE @dbname nvarchar(1000);
DECLARE @sqlCommand NVARCHAR(1000)
drop table if exists ##temp
create table ##temp (dbname varchar(500),schemaname varchar(500),tablename varchar(500),counts int)
DECLARE c1 CURSOR READ_ONLY
FOR
SELECT name FROM master.sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb');
OPEN c1
FETCH NEXT FROM c1
INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sqlCommand = 'INSERT INTO ##temp'+'
SELECT
'''+@dbname+''' as databasename,
s.name AS schemaname,
t.name AS tablename,
p.rows AS rowcounts
FROM '+@dbname+'.sys.tables t
INNER JOIN '+@dbname+'.sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN '+@dbname+'.sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN '+@dbname+'.sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN '+@dbname+'.sys.schemas s ON t.schema_id = s.schema_id
WHERE t.NAME NOT LIKE ''dt%''
AND t.is_ms_shipped = 0
AND i.OBJECT_ID > 255
GROUP BY
t.name, s.name, p.Rows
'
;
print @sqlCommand;
EXECUTE sp_executesql @sqlCommand
FETCH NEXT FROM c1
INTO @dbname
END
CLOSE c1
DEALLOCATE c1
select * from ##temp
此外,如果给定数据库中不存在表tblDoc,则此操作将完全失败。。。您可能希望检查是否正在发出该命令…而且,如果给定数据库中不存在表tblDoc,则此操作将完全失败。。。您可能需要检查是否正在发出该命令。。。