ऐसा नहीं लगता है कि इसे शुद्ध टी-एसक्यूएल में हल किया जा सकता है CHARINDEX
और न तो PATINDEX
"स्ट्रिंग" (अर्थात अधिकतम 8000 VARCHAR
या 4000 NVARCHAR
वर्ण) की खोज करने के लिए 8000 से अधिक बाइट्स का उपयोग करने की अनुमति है । इसे निम्नलिखित परीक्षणों में देखा जा सकता है:
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
उन दोनों प्रश्नों में निम्नलिखित त्रुटि है:
Msg 8152, Level 16, State 10, Line xxxxx
स्ट्रिंग या बाइनरी डेटा को छोटा कर दिया जाएगा।
और, त्रुटि से छुटकारा पाने के लिए 7000
नीचे दिए गए प्रश्नों में से किसी एक को कम करना 3999
। 4000
दोनों मामलों में एक मूल्य भी त्रुटि देगा ( N'Z'
शुरुआत में अतिरिक्त चरित्र के कारण )।
फिर भी, यह SQLCLR का उपयोग करके पूरा किया जा सकता है। स्केलर फ़ंक्शन बनाने के लिए यह काफी सरल है जो टाइप के दो इनपुट मापदंडों को स्वीकार करता है NVARCHAR(MAX)
।
निम्न उदाहरण SQL # SQLCLR लाइब्रेरी के नि: शुल्क संस्करण का उपयोग करके इस क्षमता को दिखाता है (जो मैंने बनाया था, लेकिन String_Contains फिर से नि: शुल्क संस्करण :-) में उपलब्ध है।
सेट अप
-- 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
कृपया ध्यान रखें कि String_Contains सब कुछ संवेदनशील (केस, एक्सेंट, काना और चौड़ाई) तुलना का उपयोग कर रहा है।
where st.text like '%MY_QUERY%CHARS%' ESCAPE '?'