हमेशा की तरह, मैं इस के लिए एक्सएमएल (मैं 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 डिफ़ॉल्ट यूनिकोड कोड बिंदु मिलान का उपयोग करता है।
अधिक सामान्य तरीके से गतिशील एसक्यूएल समाधान का उपयोग करने होगा:
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
स्रोत
2013-08-30 12:38:32
आपको लगता है कि आप भविष्य में एक बहुत इस तरह काम करने जा सकता है, तो आप SQL सर्वर के पूर्ण पाठ खोज सुविधा पर ध्यान देना चाहिए। @ रोमनपेकर का एक्सएमएल दृष्टिकोण काम करेगा, लेकिन यह वास्तव में इंडेक्स का उपयोग नहीं कर सकता है, इसलिए तेज़ नहीं होगा। यह ठीक है अगर आप केवल थोड़ी देर में ऐसा करते हैं, लेकिन यदि आपको ऑनलाइन उपयोगकर्ता प्रश्नों के लिए इसकी आवश्यकता है, तो आपका सर्वर बहुत तेज़ी से गिर जाएगा। शांत जवाब - – RBarryYoung
बिल्कुल सच –