Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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,是我干的。但不幸的是,这一切都在许多表中返回。我想在一个唯一的表中返回所有数据。也许用工会,但我不知道怎么做 这是我的代码: EXEC sp_msforeachdb 'select ''?''AS "DataBase", s.name, t.name AS "Tables",max(si.rows) as "Rows Line" from [?].sys.tables t inner join [?].sys.schemas s on t.schema_id = s.schema_id

是我干的。但不幸的是,这一切都在许多表中返回。我想在一个唯一的表中返回所有数据。也许用工会,但我不知道怎么做

这是我的代码:

EXEC sp_msforeachdb 'select ''?''AS "DataBase", s.name, t.name AS "Tables",max(si.rows) as "Rows Line"
 from [?].sys.tables t inner join [?].sys.schemas s 
 on t.schema_id = s.schema_id  
 inner join [?].sys.partitions si on t.object_id  = si.object_id
 where t.name like "%ATTACH" group by s.name,t.name'`

您不能在单个查询中执行此操作

您可以查询sys.databases表以获得所有数据库的临时表,然后在每个数据库上运行动态查询以将问题中的查询结果全部存储在另一个临时表中


最后,您只需从最后一个临时表中选择所有行。

我终于找到了一个解决方案。我只是使用了一个存储过程来获得我想要的结果。因此,决定将答案发布在这里,也许这会对其他人有所帮助

DECLARE @banco_nome nvarchar(MAX), @tabela_nome nvarchar(MAX)

DECLARE @banco_cursor CURSOR  
DECLARE @sqlstatement nvarchar(MAX)
DECLARE @count_sql nvarchar(MAX)
DECLARE @total int

DECLARE @RegistrosFotograficos TABLE
(
  DatabaseName nvarchar(max),
  TableName nvarchar(max),
  Total int
)

SET @banco_cursor = CURSOR FORWARD_ONLY FOR
    SELECT name FROM sys.databases

OPEN @banco_cursor
FETCH NEXT FROM @banco_cursor INTO @banco_nome
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sqlstatement = 'DECLARE tabela_cursor CURSOR FORWARD_ONLY FOR SELECT TABLE_NAME FROM ' + @banco_nome + '.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = ''BASE TABLE'' AND TABLE_NAME LIKE ''%ATTACH'' ORDER BY TABLE_NAME'
    EXEC sp_executesql @sqlstatement

    OPEN tabela_cursor
    FETCH NEXT FROM tabela_cursor INTO @tabela_nome
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @count_sql = 'USE ' + @banco_nome + '; SELECT @total=COUNT(1) FROM ' + @tabela_nome;
        EXECUTE sp_executesql @count_sql, N'@total int OUTPUT', @total=@total OUTPUT

        INSERT INTO @RegistrosFotograficos (DatabaseName, TableName, Total) VALUES (@banco_nome, @tabela_nome, @total);

        FETCH NEXT FROM tabela_cursor INTO @tabela_nome
    END
    CLOSE tabela_cursor;
    DEALLOCATE tabela_cursor;

    FETCH NEXT FROM @banco_cursor INTO @banco_nome
END
CLOSE @banco_cursor;
DEALLOCATE @banco_cursor;

SELECT * FROM @RegistrosFotograficos

这将列出给定数据库中的所有表以及每个表中的行数。请注意,结果位于名为results的表中:

set nocount on

declare @curtable sysname
declare @prevtable sysname
declare @curcount int
declare @tsql varchar(500)

if object_ID('tempdb..#curtables','U') is not null
    drop table #curtables

select name  into #curtables 
from sys.objects 
where type='U' 
order by 1

if object_id('tempdb..#results','U') is not null
    drop table #results 

create table #results(name sysname,numrows int)

select top 1 @curtable=name from #curtables order by name
while (1=1)
begin

    set @tsql = 'select '''+quotename(@curtable) +''',count(*) numrows  from '+quotename(@curtable)
    print @tsql
    insert into #results
    exec (@tsql)
    set @prevtable= @curtable 
    select top 1 @curtable = name 
    from #curtables 
    where name > @prevtable 
    order by name
    if   @curtable=@prevtable
        break

结束

thx编辑:我试图理解你说的话,但我仍然有很多问题…你能告诉我怎么做,创建一个脚本,并让一些评论让我理解它。不,对不起,我手边没有这个脚本。把它分解成几个小步骤,每一个都试一下,如果你有一个具体的问题,可以问一个新的问题。好的,谢谢回复@Tab Alleman。我会想办法摆脱这个麻烦的,哈哈哈。。。