हाँ, पूर्ण पाठ खोज के साथ संभव है, और संभवतः सबसे अच्छा उत्तर है। सीधे टी-एसक्यूएल समाधान के लिए, आप एक स्प्लिट फ़ंक्शन का उपयोग कर सकते हैं और शामिल हो सकते हैं, उदा। dbo.Numbers नामक संख्याओं की एक तालिका मानते हुए (आपको एक अलग ऊपरी सीमा तय करने की आवश्यकता हो सकती है):
SET NOCOUNT ON;
DECLARE @UpperLimit INT;
SET @UpperLimit = 200000;
WITH n AS
(
SELECT
rn = ROW_NUMBER() OVER
(ORDER BY s1.[object_id])
FROM sys.objects AS s1
CROSS JOIN sys.objects AS s2
CROSS JOIN sys.objects AS s3
)
SELECT [Number] = rn - 1
INTO dbo.Numbers
FROM n
WHERE rn <= @UpperLimit + 1;
CREATE UNIQUE CLUSTERED INDEX n ON dbo.Numbers([Number]);
और एक बंटवारा फ़ंक्शन जो संख्याओं की उस तालिका का उपयोग करता है:
CREATE FUNCTION dbo.SplitStrings
(
@List NVARCHAR(MAX)
)
RETURNS TABLE
AS
RETURN
(
SELECT DISTINCT
[Value] = LTRIM(RTRIM(
SUBSTRING(@List, [Number],
CHARINDEX(N',', @List + N',', [Number]) - [Number])))
FROM
dbo.Numbers
WHERE
Number <= LEN(@List)
AND SUBSTRING(N',' + @List, [Number], 1) = N','
);
GO
तब आप बस इतना ही कह सकते हैं:
SELECT key, NvarcharColumn /*, other cols */
FROM dbo.table AS outerT
WHERE EXISTS
(
SELECT 1
FROM dbo.table AS t
INNER JOIN dbo.SplitStrings(N'list,of,words') AS s
ON t.NvarcharColumn LIKE '%' + s.Item + '%'
WHERE t.key = outerT.key
);
एक प्रक्रिया के रूप में:
CREATE PROCEDURE dbo.Search
@List NVARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
SELECT key, NvarcharColumn /*, other cols */
FROM dbo.table AS outerT
WHERE EXISTS
(
SELECT 1
FROM dbo.table AS t
INNER JOIN dbo.SplitStrings(@List) AS s
ON t.NvarcharColumn LIKE '%' + s.Item + '%'
WHERE t.key = outerT.key
);
END
GO
तब आप बस @List
. में पास कर सकते हैं (उदा. EXEC dbo.Search @List = N'foo,bar,splunge'
) सी# से।
यह बहुत तेज़ नहीं होगा, लेकिन मुझे यकीन है कि यह सभी डेटा को C# में खींचने और इसे मैन्युअल रूप से डबल-नेस्टेड लूप करने की तुलना में तेज़ होगा।