Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 跨多个SQL Server数据库计算行数_Sql Server - Fatal编程技术网

Sql server 跨多个SQL Server数据库计算行数

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

我试图从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 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,则此操作将完全失败。。。您可能需要检查是否正在发出该命令。。。