欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SQL SERVER 模糊查询列名

程序员文章站 2022-05-09 17:21:53
...

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

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对应的信息

结果如下:
SQL SERVER 模糊查询列名
好了,又到了振奋人心的撒花花环节
SQL SERVER 模糊查询列名