ОБНОВЛЕННЫЙ ОТВЕТ: Исправлено ваше выражение
Это будет работать и основано на том, что опубликовал @Lukstroms; его не соответствует вашему второму требованию (когда @N - это дефис) это с использованием ngrams8k Это будет обрабатывать ситуации, когда @N представляет середину слова или da sh -
.
DECLARE
@Text VARCHAR(1000) = 'this-is-product-url-prepared-for-better-Google-Search-Engnine-SEO-totalLength-should-be-70-characters',
@N INT = 70;
SELECT SUBSTRING(@Text,0,MAX(ng.nxt))
FROM
(
SELECT ng.position, nxt = LEAD(ng.Position,1) OVER (ORDER BY ng.Position), ng.Token
FROM samd.ngrams8k(@Text,1) AS ng
WHERE ng.Token = '-'
) AS ng
WHERE ng.Position <= @N;
FINAL UPDATE (ПРИМЕЧАНИЕ О N -GRAMS)
Как правильно заметил Мартин, решение N-Grams слишком сложное, но я был в ru sh и не смог исправить исходное выражение CHARINDEX для OP. Тем не менее, решение ngrams8k очень быстро и гибко.
Например, допустим, требование включало параметр верхней и нижней границы; Например, нам нужно все между первый дефис выше @Low
и последний дефис ниже @High
. Это можно сделать с помощью небольшого изменения в ответе выше.
DECLARE
@Text VARCHAR(1000) = 'this-is-product-url-prepared-for-better-Google-Search-Engnine-SEO-totalLength-should-be-70-characters',
@Low INT = 16,
@high INT = 70;
SELECT NewString = SUBSTRING(@Text,MIN(ng.position)+1, MAX(ng.nxt)-MIN(ng.position)-1)
FROM
(
SELECT ng.position, nxt=LEAD(ng.Position,1) OVER (ORDER BY ng.Position)
FROM samd.ngrams8k(@Text,1) AS ng
WHERE ng.Token = '-'
) AS ng
WHERE ng.Position <= @high AND ng.Position > @low;
Возвращает:
prepared-for-better-Google-Search-Engnine-SEO-totalLength