2017-06-05 30 views
0

我做到了。但不幸的是,这一切都在许多表中。我想在一个独特的表格中返回所有内容。也许使用“联盟”,但我不知道该怎么做。如何使用最终的“附加”列出我的数据库的所有数据库和所有表,并列出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 
inner join [?].sys.partitions si on t.object_id = si.object_id 
where t.name like "%ATTACH" group by s.name,t.name'` 
+0

THX编辑:) – Gladiador

回答

0

我终于找到一个solution.i只是使用的存储过程具有结果我一直在寻找for.So决定张贴在这里的答案也许这将帮助别人。

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', @[email protected] 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 
0

你不能做一个单一的查询。

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

那么,在年底,您只需选择从最后临时表中的所有行。

+0

我试图了解什么ü说,但我仍然有许多问题...可以ü请告诉我hjow做,创建一个脚本,让我只是一些评论理解它。 – Gladiador

+0

不,对不起,我没有这方面的脚本。将其分解成小步骤并尝试每个步骤,然后问一个新问题,如果你有一个特定的问题。 –

+0

好的thx回复@Tab Alleman。我会尽力找到摆脱这种麻烦的想法哈哈哈...... – Gladiador

0

这将列出给定数据库中的所有表以及每个表中的行数。注意结果表中的命名#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 @[email protected] 
     break 

相关问题