Просто для удовольствия, и поскольку в первоначальном вопросе упоминалось о RegEx, я подумал, что приведу пример, использующий регулярные выражения. Да, для этого требуется SQLCLR, и не каждый может или будет использовать это, но это вариант.
В этом примере используется существующая библиотека SQLCLR с именем SQL # (SQLsharp) , автором которой я являюсь, но функции регулярных выражений (только с 3 исключениями) бесплатны.
В примере используются примерные переменные URL-адресов и таблиц правил из ответа Аарона Бертранда, но в качестве исходных строк используются числа (так как это исходный запрос и регулярное выражение в этом отношении специфично), и я добавил тест -case, чтобы показать, что строка «222» не соответствует ни одной части «2222».
DECLARE @URLs TABLE (URL VARCHAR(2000));
INSERT @URLs SELECT '/MyServer/MyPage?Param=111'
UNION ALL SELECT '/MyServer/MyOtherPage?Param=222'
UNION ALL SELECT '/MyServer222/MyOtherPage?Param=222'
UNION ALL SELECT '/MyServer222/MyOtherPage?Param=2222'
UNION ALL SELECT '/MyServer/MyOtherPage?Param2=333'
UNION ALL SELECT '/MyServer/MyOtherPage?Param=222&Param2=333'
UNION ALL SELECT '/MyServer/MyOtherPage?Param=2222&Param2=333'
UNION ALL SELECT '/MyServer/MyOtherPage?Param2=222&Param=222';
DECLARE @Rules TABLE(pSrc VARCHAR(32), pDest VARCHAR(32));
INSERT @Rules SELECT '111', 'YYY'
UNION ALL SELECT '222', 'BBB'
UNION ALL SELECT '2222', 'bbb'
UNION ALL SELECT '333', 'KKK';
SELECT SQL#.RegEx_Replace(u.url,
'(.*Param=)' + r.pSrc + '([^0-9]+|$)',
'$1' + r.pDest + '$2',
-1, 1, '')
FROM @URLs u
CROSS JOIN @Rules r
WHERE SQL#.RegEx_IsMatch(u.url,
'(.*Param=)' + r.pSrc + '([^0-9]+|$)',
1, '') = 1
-- OR, using RegEx look-behind and look-ahead
SELECT SQL#.RegEx_Replace(u.url,
'(?<=Param=)' + r.pSrc + '(?=[^0-9]+|$)',
r.pDest,
-1, 1, '')
FROM @URLs u
CROSS JOIN @Rules r
WHERE SQL#.RegEx_IsMatch(u.url,
'(?<=Param=)' + r.pSrc + '(?=[^0-9]+|$)',
1, '') = 1
Результаты:
/MyServer/MyPage?Param=YYY
/MyServer/MyOtherPage?Param=BBB
/MyServer222/MyOtherPage?Param=BBB
/MyServer222/MyOtherPage?Param=bbb
/MyServer/MyOtherPage?Param=BBB&Param2=333
/MyServer/MyOtherPage?Param=bbb&Param2=333
/MyServer/MyOtherPage?Param2=222&Param=BBB
Чтобы быть справедливым для строгих решений T-SQL, это было проверено не на производительность, а на функциональность и гибкость. Какое решение работает лучше, должно быть проверено на вашем сервере.