Förutsatt att du har dina fält i detta format:
00Data0007
000000Data0011
0000Data0015
kan du göra följande:
-
Skapa en beräknad kolumn:
ndata AS RIGHT(REVERSE(data), LEN(data) - 4)
Detta kommer att omvandla dina kolumner till följande:
ataD00 ataD000000 ataD0000
-
Skapa ett index för den kolumnen
-
Skicka den här frågan för att söka efter strängen
Data
:SELECT * FROM mytable WHERE ndata LIKE N'ataD%' AND SUBSTRING(ndata, LEN(N'ataD') + 1, LEN(ndata)) = REPLICATE('0', LEN(ndata) - LEN('ataD'))
Det första villkoret kommer att använda ett index för grovfiltrering.
Den andra kommer att se till att alla inledande tecken (som blev de efterföljande tecknen i den beräknade kolumnen) bara är nollor.
Se det här inlägget i min blogg för detaljer om prestanda:
Uppdatera
Om du bara vill ha ett index på SUBSTRING
utan att ändra ditt schema är att skapa en vy ett alternativ.
CREATE VIEW v_substring75
WITH SCHEMABINDING
AS
SELECT s.id, s.data, SUBSTRING(data, 7, 5) AS substring75
FROM mytable
CREATE UNIQUE CLUSTERED INDEX UX_substring75_substring_id ON (substring75, id)
SELECT id, data
FROM v_substring75
WHERE substring75 = '12345'