如何为表中的任何列选择类似字符串的记录?

ber*_*436 6 sql t-sql sql-server xquery sqlxml

我知道我可以通过使用在t-sql的表中的一列中搜索一个术语like %termToFind%.而且我知道我可以在表格中获得所有列:

SELECT * 
FROM MyDataBaseName.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = N'MyTableName`
Run Code Online (Sandbox Code Playgroud)

如何在表的每个列上执行类似的comprparison?我有一个非常大的桌子,所以我不能拼出LIKE每一列.

Rom*_*kar 10

和往常一样,我会为此建议xml(如果SQL Server本身支持它,我建议使用JSON :)).您可以尝试使用此查询,但它可能在大量行上执行得不是很好:

;with cte as (
    select
        *,
        (select t.* for xml raw('data'), type) as data
    from test as t
)
select *
from cte
where data.exist('data/@*[local-name() != "id" and contains(., sql:variable("@search"))]') = 1
Run Code Online (Sandbox Code Playgroud)

请参阅sql fiddle demo更详细的示例.

重要说明亚历山大·费德林的意见:应该理解的是contains功能是区分大小写的,并且使用的XQuery默认Unicode代码点排序规则的字符串比较.

更通用的方法是使用动态SQL解决方案:

declare @search nvarchar(max)
declare @stmt nvarchar(max)

select @stmt = isnull(@stmt + ' or ', '') + quotename(name) + ' like @search'
from sys.columns as c
where c.[object_id] = object_id('dbo.test')
--
-- also possible
--
-- select @stmt = isnull(@stmt + ' or ', '') + quotename(column_name) + ' like @search'
-- from INFORMATION_SCHEMA.COLUMNS
-- where TABLE_NAME = 'test'

select @stmt = 'select * from test where ' + @stmt

exec sp_executesql
    @stmt = @stmt,
    @params = N'@search nvarchar(max)',
    @search = @search
Run Code Online (Sandbox Code Playgroud)

sql fiddle demo

  • 另外,应该理解contains函数区分大小写,并使用xQuery默认的Unicode代码点排序规则进行字符串比较http://sqlfiddle.com/#!3/473e5/5 BTW +1获得一个很酷的答案;) (4认同)