One of the rare situations where a quirky update is a good idea. Don't expect the best performance, but any other approach with loops, recursive CTEs etc will have their RBAR too...
The advantage of this approach is: You can maintain your replace values in a table. You can even replace longer strings with other longer strings and - which can be really magic: By defining the order, you can even do a cascading replace...
CREATE TABLE ReplaceValues (FindChar VARCHAR(1) NOT NULL
,ReplWith VARCHAR(1) NOT NULL
,SortOrder INT NOT NULL);
INSERT INTO ReplaceValues VALUES(',',' ',1)
,('"','',2)
,(':','',3)
,('-','',4)
,('/','',5)
,('\','',6)
,('&','',7);
GO
--Normally you cannot use the quirky update inlined, but you can wrap it within a scalar function:
CREATE FUNCTION dbo.MultiReplace(@ReplaceTarget VARCHAR(MAX))
RETURNS VARCHAR(MAX)
AS
BEGIN
--Quirky Update: One of the rare situations where this is a good idea
SELECT @ReplaceTarget=REPLACE(@ReplaceTarget,rv.FindChar,rv.ReplWith)
FROM ReplaceValues AS rv
ORDER BY rv.SortOrder;
RETURN @ReplaceTarget;
END
GO
--Your table
declare @t table(city varchar(100))
insert into @t values('ab,c:d\/tyu'),('frd/hj&er\gg:');
--...and the magic is going in here:
SELECT t.city
,dbo.MultiReplace(t.city) AS CleanedCity
FROM @t AS t
GO
--Clean-Up
DROP FUNCTION dbo.MultiReplace;
DROP TABLE ReplaceValues;
The result
city CleanedCity
ab,c:d\/tyu ab cdtyu
frd/hj&er\gg: frdhjergg