Như thường lệ, tôi sẽ đề xuất xml cho điều này (tôi sẽ đề xuất JSON nếu SQL Server có hỗ trợ gốc cho nó :)). Bạn có thể cố gắng sử dụng truy vấn này, mặc dù nó có thể thực hiện không quá tốt trên số lượng lớn hàng:
;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
thấy sql fiddle demo ví dụ chi tiết hơn.
quan trọng lưu ý bởi Alexander Fedorenko trong ý kiến: nó nên được hiểu rằng contains
chức năng là trường hợp nhạy cảm và sử dụng XQuery mặc định Unicode điểm mã collation cho chuỗi so sánh.
More cách tổng quát sẽ sử dụng giải pháp SQL động:
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
sql fiddle demo
Nguồn
2013-08-30 12:38:32
Nếu bạn nghĩ rằng bạn có thể làm những việc như thế này rất nhiều trong tương lai, thì bạn nên xem xét cơ sở Tìm kiếm toàn văn bản của SQL Server. Cách tiếp cận XML của @ RomanPekar sẽ hoạt động, nhưng nó không thể thực sự sử dụng các chỉ mục, vì vậy sẽ không nhanh chóng. Đó là tốt nếu bạn chỉ làm điều này một lần trong một thời gian, nhưng nếu bạn cần điều này cho các truy vấn người dùng trực tuyến, máy chủ của bạn sẽ bị sa lầy xuống khá nhanh chóng. – RBarryYoung
@RBarryBạn rất đúng –