休闲小憩 康小孩的PROC问题

本文介绍了一种使用存储过程实现动态SQL的方法,该方法能够接受不确定数量的表名作为输入,并通过字符串操作和循环结构拼接出包含这些表的UNION查询。文中详细展示了创建用于拆分字符串的函数及实现动态SQL的存储过程的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作为职业的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康小孩要加油咯~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值