Без версии, я полагаю, у вас есть доступ к последним инструментам. Поэтому вы можете использовать FOR XML PATH
для создания строки символов, которые необходимо заменить, а затем TRANSLATE
, чтобы избавиться от них всех:
WITH C AS(
SELECT *
FROM (VALUES('!'),
('"'),
('$'),
('%'),
('&'),
(''''),
('('),
(')'),
('*'),
('+'),
(','),
('.'),
('/'))V(InVCh)),
PS AS (
SELECT *
FROM (VALUES('Prod1','Store1'),
('Pr$od!2','Sto$re!2'),
('P:;()ro!!!"d3','S:;()to!!!"re3')) V(Product,Store))
SELECT REPLACE(TRANSLATE(PS.Product,V.C,REPLICATE(LEFT(V.C,1),LEN(V.C))),LEFT(V.C,1),'') AS Product,
REPLACE(TRANSLATE(PS.Store,V.C,REPLICATE(LEFT(V.C,1),LEN(V.C))),LEFT(V.C,1),'') AS Store
FROM PS
CROSS APPLY (VALUES((SELECT '' + InVCh
FROM C
FOR XML PATH(''),TYPE).value('.','varchar(MAX)')))V(C);
дб <> скрипка
Обратите внимание, что возвращаемое значение для 3-й строки - 'P:;rod3'
и 'S:;tore3'
, так как ни точка с запятой (;
), ни двоеточие (:
) отсутствуют в списке символов, которые необходимо удалить. Вам нужно будет добавить все символы, которые нужно заменить.
Похоже, что OP упомянул в комментариях, что они используют 2016 год (почему важно знать, какую версию вы используете!). Используя Ngrams8K
, вы можете сделать это (хотя и выглядит грязно):
WITH C AS(
SELECT *
FROM (VALUES('!'),
('"'),
('$'),
('%'),
('&'),
(''''),
('('),
(')'),
('*'),
('+'),
(','),
('.'),
('/'))V(InVCh)),
PS AS (
SELECT *
FROM (VALUES(1,'Prod1','Store1'),
(2,'Pr$od!2','Sto$re!2'),
(3,'P:;()ro!!!"d3','S:;()to!!!"re3')) V(ID,Product,Store))
SELECT PS.Product,V.Product,
PS.Store,V.Store
FROM PS
CROSS APPLY (VALUES((SELECT '' + N.token
FROM dbo.NGrams8k(PS.Product,1) N
WHERE NOT EXISTS (SELECT 1
FROM C
WHERE C.InVCh = N.token)
ORDER BY position
FOR XML PATH(''),TYPE).value('.','varchar(8000)'),
(SELECT '' + N.token
FROM dbo.NGrams8k(PS.Store,1) N
WHERE NOT EXISTS (SELECT 1
FROM C
WHERE C.InVCh = N.token)
ORDER BY position
FOR XML PATH(''),TYPE).value('.','varchar(8000)')))V(Product,Store)