এটি খাঁটি টি-এসকিউএল-তে সমাধান করা যায় না বলে মনে হয় না এবং "সন্ধানের জন্য" স্ট্রিংয়ের (অর্থাৎ সর্বোচ্চ 8000 বা 4000 অক্ষর) 8000 বাইটের বেশি ব্যবহার করার অনুমতি দেয় CHARINDEX
না । এটি নিম্নলিখিত পরীক্ষাগুলিতে দেখা যাবে:PATINDEX
VARCHAR
NVARCHAR
SELECT 1 WHERE CHARINDEX(N'Z' + REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 7000),
N'Z' + REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 6000)) > 0
SELECT 1 WHERE PATINDEX(N'Z' + REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 7000),
N'Z' + REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 6000)) > 0
এই উভয় প্রশ্নেরই নিম্নলিখিত ত্রুটিটি ফিরে আসে:
এমএসজি 8152, স্তর 16, রাজ্য 10, লাইন এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স
স্ট্রিং বা বাইনারি ডেটা কেটে যাবে।
এবং, 7000
এই কোয়েরির যে কোনও একটিতে হ্রাস করার ফলে 3999
ত্রুটি থেকে মুক্তি পাওয়া যায়। 4000
উভয় ক্ষেত্রে একটি মানও ত্রুটি ঘটবে ( N'Z'
শুরুতে অতিরিক্ত চরিত্রের কারণে )।
যাইহোক, এসকিউএলসিআরআর ব্যবহার করে এটি সম্পন্ন করা যায়। এটি স্কেলার ফাংশন তৈরি করা মোটামুটি সহজ যা দুটি ধরণের ইনপুট পরামিতি গ্রহণ করে NVARCHAR(MAX)
।
নিম্নলিখিত উদাহরণটি এসকিউএল # এসকিউএলসিআরআর লাইব্রেরির ফ্রি সংস্করণ (যা আমি তৈরি করেছি, তবে স্ট্রিং_সন্টেইনসটি আবার ফ্রি সংস্করণে উপলব্ধ :-) ব্যবহার করে এই ক্ষমতাটি চিত্রিত করে ।
সেটআপ
-- DROP TABLE #ContainsData;
CREATE TABLE #ContainsData
(
ContainsDataID INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
Col1 NVARCHAR(MAX) NOT NULL
);
INSERT INTO #ContainsData ([Col1])
VALUES (N'Q' + REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 15000)),
(N'W' + REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 20000)),
(N'Z' + REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 70000));
-- verify the lengths being over 8000
SELECT tmp.[ContainsDataID], tmp.[Col1], DATALENGTH(tmp.[Col1])
FROM #ContainsData tmp;
পরীক্ষা-নিরীক্ষা
SELECT tmp.[ContainsDataID], tmp.[Col1], DATALENGTH(tmp.[Col1])
FROM #ContainsData tmp
WHERE SQL#.String_Contains(tmp.[Col1], REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 15100)) = 1;
-- IDs returned: 2 and 3
SELECT tmp.[ContainsDataID], tmp.[Col1], DATALENGTH(tmp.[Col1])
FROM #ContainsData tmp
WHERE SQL#.String_Contains(tmp.[Col1], REPLICATE(CONVERT(NVARCHAR(MAX), N'a'), 26100)) = 1;
-- IDs returned: 3
দয়া করে মনে রাখবেন যে স্ট্রিং_ কনটেনগুলি একটি সংবেদনশীল (কেস, অ্যাকসেন্ট, কানা এবং প্রস্থ) তুলনা ব্যবহার করছে।
where st.text like '%MY_QUERY%CHARS%' ESCAPE '?'