มันจะไม่ปรากฏที่ว่านี้จะสามารถแก้ไขได้ในที่บริสุทธิ์ T-SQL ตั้งแต่ค่าCHARINDEXมิได้PATINDEXอนุญาตให้มีการใช้มากกว่า 8000 ไบต์ใน "เพื่อค้นหา" สตริง (สูงสุดคือ 8000 VARCHARหรือ 4000 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, สาย 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 '?'