作为职业的SQL选手,今天康小孩竟然问了我一个这样的问题:
如何通过一个存储过程实现查询多个表的union,表的个数不确定。
即要这么个东西:EXEC TestKR 'tableA,TableB,TableC'
拿到这个问题,简单想了想,思路是将多个表名以参数形式传到proc里(多个表名以逗号分隔),然后拼接sql查询语句,执行,返回结果。
找了个用sql实现split的小方法:
create function f_split(@c varchar(2000),@split varchar(2))
returns @t table(col varchar(20))
as
begin
while(charindex(@split,@c)<>0)
begin
insert @t(col) values (substring(@c,1,charindex(@split,@c)-1))
set @c = stuff(@c,1,charindex(@split,@c),'')
end
insert @t(col) values (@c)
return
end
go
接下来是实现存储过程:
Create PROCEDURE TestKR
@tables varchar(200)
AS
DECLARE @sql VARCHAR(500)
DECLARE @count int
DECLARE @i int
select col,ROW_NUMBER() OVER(ORDER BY col)AS row_num INTO kr_temp
from dbo.f_split(@tables,',')AS rawtable
SET @sql='';
SET @i=1;
SELECT @count=COUNT(*) FROM kr_temp;
WHILE(@i<=@count)
BEGIN
DECLARE @table_name VARCHAR(100);
SELECT @table_name=col FROM kr_temp WHERE row_num=@i;
PRINT @table_name
SET @sql+=' select * from '+ CONVERT(VARCHAR(100),@table_name);
PRINT @sql
IF(@i<>@count)
BEGIN
SET @sql+=' union ';
END
SET @i=@i+1;
END
DROP TABLE kr_temp;
EXEC(@sql);
还是挺有意思的~
上面的实现肯定还有很多待改进的地方。。。。
哎~ 资深的SQL康小孩要加油咯~