SQL 服务器:仅当找到子字符串时才显示整列

SQL Server: display whole column only if substring found

正在使用 SQL Sever 2016。我受制于我们无法创建函数或存储过程这一事实。我试图在 table (75) 的许多列中找到 %word%。现在,我有一大堆

and (fieldname1 like %word%
     or fieldname2 like %word%
     or fieldname3 like %word%) etc. 

虽然很麻烦,但这确实为我提供了正确的结果。然而:

  1. 我想简化这个
  2. select 中,当且仅当它找到 %word% 时我想显示整个列(或者甚至只显示列名也行)

提前感谢您的任何想法。

一个选项使用 cross apply 反转 table 然后搜索:

select v.*
from mytable t
cross apply (values 
    ('fieldname1', fieldname1), 
    ('fieldname2', fieldname2),
    ('fieldname3', fieldname3)
) v(fieldname, fieldvalue)
where v.fieldvalue like '%word%'

请注意,如果不止一列包含搜索词,您将在结果集中获得多行。我不确定你想如何处理这个用例(有选项)。

--...slow...
declare @searchfor varchar(100) = '23';

select @searchfor as [thevalue], 
    thexml.query('for $a in (/*[contains(upper-case(.), upper-case(sql:variable("@searchfor")))]) 
    return concat(local-name($a[1]), ",")').value('.', 'nvarchar(max)') as [appears_in_columns],
    *
from
(
select *, (select o.* for xml path(''), type) as thexml
from sys.all_objects as o --table goes here
) as src
where thexml.exist('/*[contains(upper-case(.), upper-case(sql:variable("@searchfor")))]') = 1;
SELECT OBJECT_NAME(id) ObjectName , [Text]  
FROM syscomments 
WHERE TEXT LIKE '%word%'