2016-06-02 3 views
0

У меня есть база данных с именем test, который имеет 2 мнения и 2 таблицы в схеме dbo, как это: example databaseСписок количество строк каждого вида и таблицы

Я хочу создать таблицу с именем report, в котором перечислены номера строк из каждого вида и каждой таблицы. Концепция такова:

select table_name, table_type, "select count(*) from table_name" as rowCount 
into test.dbo.report 
from test.INFORMATION_SCHEMA.tables; 

test.dbo.report должен выглядеть следующим образом:

enter image description here

Однако, я понятия не имею, как реализовать. Динамический SQL, вероятно, путь, но несколько запутанный.

Я использую SQL Server 2014.

+0

какой результат вы ожидаете? – Bharadwaj

ответ

3

Вы можете использовать динамический SQL, чтобы построить гигантскую цепочку union all select утверждений:

declare @sql nvarchar(max) = '' 

-- use an undocumented(?) trick with string concatenation in a select statement 
select @sql = @sql + 'union all select ' + 
    '''' + TABLE_NAME + ''' as TABLE_NAME, ' + 
    '''' + TABLE_TYPE + ''' as TABLE_TYPE, ' + 
    '(select count(*) from ' + TABLE_NAME + ') as [COUNT]' + 
    char(13) + char(10) 
from INFORMATION_SCHEMA.TABLES 

-- remove leading "union all" 
set @sql = right(@sql, len(@sql)-len('union all ')) 

--print @sql -- to check what's going to be executed 

exec sp_executesql @sql 

SQL, он строит и выполняет выглядит следующим образом:

select 'customers' as TABLE_NAME, 'BASE TABLE' as TABLE_TYPE, (select count(*) from customers) as [rowcount] 
union all select 'items' as TABLE_NAME, 'BASE TABLE' as TABLE_TYPE, (select count(*) from items) as [rowcount] 
union all select 'orders' as TABLE_NAME, 'VIEW' as TABLE_TYPE, (select count(*) from orders) as [rowcount] 
union all ... 

К сожалению, вы не можете выполнить динамический SQL в качестве столбца в предложении select - нет ничего, что позволило бы вам сделать что-либо просто:

select table_name, table_type, exec('select count(*) from ' + table_name) as [count] 
into test.dbo.report --   /\== doesn't work 
from test.INFORMATION_SCHEMA.tables; 
1

Выполнить ниже запрос

DECLARE  @SQL VARCHAR(MAX); 
    SET   @SQL = ''; 

    SELECT @SQL = @SQL + 'INSERT INTO test.dbo.report SELECT ''' + 
       TABLE_SCHEMA + '.' + table_name + ''', ''' + table_type + ''', COUNT(*) FROM ' + 
       TABLE_SCHEMA + '.' + table_name + 
       CHAR(13) from INFORMATION_SCHEMA.tables 

    EXEC (@SQL) 
+0

Неверное имя объекта 'test.dbo.report'. – realtemper

+0

вы создали таблицу «report» в тестовой базе данных в соответствии с вашим обновлением вопроса «test.dbo.report» к вашей базе данных .schemaname.table name « –

+0

Работал с' create table test.dbo.report ( table_name varchar (50), table_type varchar (50), rowCnt int ); 'preended. – realtemper

3

Поскольку вы специально с помощью SQL Server, вы не должны искусственно ограничивать себя с помощью информационной схемы. Необходимая информация находится в динамических представлениях управления. Или один вид, в частности:

select object_name(object_id), sum(rows) 
from sys.partitions 
where index_id in (0, 1) 
group by object_id; 

Количество строк приблизительное, но, как правило, оно довольно близко к моему опыту. У вас есть возможность не сканировать данные каждого стола, чтобы получить счет. Примечание: это не будет работать для представлений, если представление не является индексированным представлением.

Смежные вопросы