Ten en cuenta que en la informática un problema casi siempere suele tener más de una soluciones, por lo tanto te mostraremos la mejor y más eficiente.
Solución:
Un truco útil en SQL es la habilidad de usar @var = function(...)
para asignar un valor. Si tiene varios registros en su conjunto de registros, su var se asigna varias veces con efectos secundarios:
declare @badStrings table (item varchar(50))
INSERT INTO @badStrings(item)
SELECT '>' UNION ALL
SELECT '<' UNION ALL
SELECT '(' UNION ALL
SELECT ')' UNION ALL
SELECT '!' UNION ALL
SELECT '?' UNION ALL
SELECT '@'
declare @testString varchar(100), @newString varchar(100)
set @teststring = 'Juliet ro><0zs my s0x()[email protected][email protected][email protected]!'
set @newString = @testString
SELECT @newString = Replace(@newString, item, '') FROM @badStrings
select @newString -- returns 'Juliet ro0zs my s0xrzone'
Consideraría seriamente hacer un CLR UDF en su lugar y usar expresiones regulares (tanto el string y el patrón se puede pasar como parámetros) para realizar una búsqueda completa y reemplazar un rango de caracteres. Debería superar fácilmente este UDF de SQL.
¡Realmente me gusta la solución de @Juliett! Simplemente usaría un CTE para obtener todos los caracteres no válidos:
DECLARE @badStrings VARCHAR(100)
DECLARE @teststring VARCHAR(100)
SET @badStrings = '><()[email protected]'
SET @teststring = 'Juliet ro><0zs my s0x()[email protected][email protected][email protected]!'
;WITH CTE AS
(
SELECT SUBSTRING(@badStrings, 1, 1) AS [String], 1 AS [Start], 1 AS [Counter]
UNION ALL
SELECT SUBSTRING(@badStrings, [Start] + 1, 1) AS [String], [Start] + 1, [Counter] + 1
FROM CTE
WHERE [Counter] < LEN(@badStrings)
)
SELECT @teststring = REPLACE(@teststring, CTE.[String], '') FROM CTE
SELECT @teststring
Julieta ro0zs mi s0xrzone