cbh*_*ang 1 sql-server dynamic-sql information-schema
我有一个名为的数据库test,它在架构中具有2个视图和2个表,dbo如下所示:

我想创建一个表report,该表列出每个视图和每个表的行号。这个概念是这样的:
select table_name, table_type, "select count(*) from table_name" as rowCount
into test.dbo.report
from test.INFORMATION_SCHEMA.tables;
Run Code Online (Sandbox Code Playgroud)
的test.dbo.report应如下所示:
但是,我不知道如何实现。动态SQL可能是解决之道,但有些令人困惑。
我正在使用SQL Server 2014。
由于您专门使用SQL Server,因此无需人为地限制使用信息架构。您需要的信息在动态管理视图中。或者,一个视图专门:
select object_name(object_id), sum(rows)
from sys.partitions
where index_id in (0, 1)
group by object_id;
Run Code Online (Sandbox Code Playgroud)
行数是大概的,但是根据我的经验,它通常很接近。您的好处是不必为了获得计数而扫描每个表的数据。注意:除非视图是索引视图,否则这不适用于视图。
您可以使用动态 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
Run Code Online (Sandbox Code Playgroud)
它构建和执行的 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 ...
Run Code Online (Sandbox Code Playgroud)
不幸的是,您无法将动态 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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4830 次 |
| 最近记录: |