可能重复:
how do find the number of rows in a table when the table name is in a variable?
我需要在SQL Server数据库(2000)中查找包含列的一个值的表。
我可以使用以下查询输出包含my_column
的可能候选表的列表:
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = 'my_column'
我想得到的是以下带有结果的伪查询:
select '$TABLE_NAME', count(*) from $TABLE_NAME where my_column = '12345'
table01 1
table02 5
table03 0
table04 3
或更普遍的表述:是否可以使FROM子句变量?
答案 0 :(得分:3)
唯一的方法是使用动态SQL:
declare @stmt nvarchar(max), @value nvarchar(max)
select @stmt = isnull(@stmt + ' union all ', '') + '
select ''' + TABLE_NAME + ''', count(*) from ' + TABLE_NAME + ' where my_column = @value'
from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME = 'my_column'
select @value = '12345'
exec sp_executesql
@stmt = @stmt,
@params = N'@value nvarchar(max)',
@value = @value
<强>更新强>
对于SQL 2000,您可以使用nvarchar(4000)
如果您有非常多的表,则可以使用临时表+游标:
create table #Temp_Results (table_name nvarchar(128), cnt int)
declare @stmt nvarchar(4000), @value nvarchar(128)
declare t_cursor cursor local fast_forward for
select
'select ''' + TABLE_NAME + ''', count(*) from ' + TABLE_NAME + ' where id = @value'
from INFORMATION_SCHEMA.COLUMNS
where COLUMN_NAME = 'name'
select @value = 1
open t_cursor
fetch t_cursor into @stmt
while @@fetch_status = 0
begin
insert into #Temp_Results
exec sp_executesql
@stmt = @stmt,
@params = N'@value nvarchar(128)',
@value = @value
fetch t_cursor into @stmt
end
close t_cursor
deallocate t_cursor
select * from #Temp_Results
答案 1 :(得分:0)
您可以使用sp_MSforeachtable未记录的存储过程来创建FROM子句变量。这是一篇展示如何使用它的文章:sp_msForEachTable examples
答案 2 :(得分:0)
如果我理解了这个问题,你需要一个包含给定列名和每个表的记录数的表列表,是吗?如果是的话
select o.name as "Table Name", i.rowcnt as "Rows"
from sysobjects o
inner join sysindexes i on o.id = i.id
where i.indid in (0,1)
and o.id in
(select distinct id from syscolumns where name = 'My_Column')
order by o.name
要求您具有查询系统表的能力。