มันจะไม่ปรากฏที่ว่านี้จะสามารถแก้ไขได้ในที่บริสุทธิ์ 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 '?'