いつものように、私はこれについて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
より詳細な例についてはsql fiddle demoを参照してください。コメント欄でAlexander Fedorenkoによって
重要注: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
sql fiddle demo
今後、このようなことが多発していると思われる場合は、SQL Serverの全文検索機能を参照する必要があります。 @ RomanPekarのXMLアプローチはうまくいくが、実際にはインデックスを使用することはできないため、高速化はできない。これはしばらくの間だけこれをやっても問題ありませんが、オンラインのユーザークエリでこれが必要な場合は、サーバーがかなり早く落ちてしまいます。 – RBarryYoung
@RBarryYoung非常に真実 –