SQL SERVER 模糊查询列名
程序员文章站
2022-05-09 17:21:53
...
做报表开发时遇到一个比较特别的数据结构,表结构如下
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对应的信息
结果如下:
好了,又到了振奋人心的撒花花环节
上一篇: ExtJS模糊查询(二)