如果没有该版本,我假设您可以访问最新的工具。因此,您可以使用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);
db<>fiddle
请注意,第 3 行的返回值是 'P:;rod3' 和 'S:;tore3',因为分号 (;) 或冒号 (:) 都不在要删除的字符列表中。您需要添加所有需要替换的字符。
似乎 OP 在 cmets 中提到他们正在使用 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)