SQL SERVER 模糊查询列名

做报表开发时遇到一个比较特别的数据结构,表结构如下
frr表:(工位信息)
在这里插入图片描述
fr表:(vin是产品 ,abc_time表示工位abc的工作日期,abc_count 表示在工位abc的产品计数)
在这里插入图片描述
报表需求是用工位 带出对应工作日期和计数结果,
解决办法,有两种思路:
一、利用列传行,把fr的列转为行(方法很多,可以用unpivot或者union all等等);
二、模糊查询列名(嗯,因吹斯听。。)
那就用模糊查询列名,奥利给,干就完了
在这里插入图片描述
创建一个存储过程来解决:

if(exists(select * from sysobjects where name='s_select')) drop proc s_select;
--检查数据库是否存在重名的存储过程,有就删除,没有就创建
create proc s_select(@str nvarchar(max)='abc')
as
DECLARE @sql NVARCHAR(MAX)
DECLARE @col NVARCHAR(MAX)
 select @col =STUFF(( SELECT   ',' + t.name
                       FROM     ( SELECT    name
                                  FROM      syscolumns
                                  WHERE     id = ( SELECT   MAX(id)
                                                   FROM     sysobjects
                                                   WHERE    xtype = 'u'
                                                            AND name = 'fr' 
                                                 )
                                ) t
                       WHERE     reverse(substring(reverse(t.name),charindex('_',reverse(t.name)) +1,500))=@str
                       --这一句是匹配下划线前面的字符串,即对应的工位
                     FOR
                       XML PATH('')
                     ), 1, 1, '')

SET @sql = 'select vin, ' + @col + ' from fr';
EXEC(@sql); 

下面我们来执行这个存储过程:

exec s_select 'bcd'
--查询工位bcd对应的信息

结果如下:
在这里插入图片描述
好了,又到了振奋人心的撒花花环节
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值