Wie immer, ich werde xml dafür vorschlagen (ich würde JSON vorschlagen, wenn SQL Server native Unterstützung dafür hatte :)). Sie können versuchen, diese Abfrage zu verwenden, obwohl es nicht so gut auf große Anzahl von Zeilen durchführen konnte:
;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 Detailliertere Beispiel.
Wichtige Notiz von Alexander Fedorenko in den Kommentaren: sollte es selbstverständlich sein, dass contains
Funktion Groß- und Kleinschreibung und verwendet xQuery Standard-Unicode-Codepunkt Sortierung für den String-Vergleich.
Weitere allgemeine Art und Weise wäre dynamische SQL-Lösung zu verwenden:
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
Wenn Sie denken, dass Sie in Zukunft solche Dinge häufig tun könnten, sollten Sie sich die Volltext-Suchfunktion von SQL Server ansehen. @ RomanPekar's XML-Ansatz funktioniert, aber es kann nicht wirklich Indizes verwenden, wird also nicht schnell sein. Das ist in Ordnung, wenn Sie dies nur gelegentlich tun, aber wenn Sie dies für Online-Benutzerabfragen benötigen, wird Ihr Server ziemlich schnell stecken bleiben. – RBarryYoung
@RBarryYoung sehr wahr –