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)