Me enfrenté a este problema hace varios años, así que escribí una función SQL para hacer el truco. Here is the original article (se utilizó para eliminar texto de HTML). ya que he actualizado la función, de la siguiente manera:
IF (object_id('dbo.fn_CleanString') IS NOT NULL)
BEGIN
PRINT 'Dropping: dbo.fn_CleanString'
DROP function dbo.fn_CleanString
END
GO
PRINT 'Creating: dbo.fn_CleanString'
GO
CREATE FUNCTION dbo.fn_CleanString
(
@string varchar(8000)
)
returns varchar(8000)
AS
BEGIN
---------------------------------------------------------------------------------------------------
-- Title: CleanString
-- Date Created: March 26, 2011
-- Author: William McEvoy
--
-- Description: This function removes special ascii characters from a string.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
declare @char char(1),
@len int,
@count int,
@newstring varchar(8000),
@replacement char(1)
select @count = 1,
@len = 0,
@newstring = '',
@replacement = ' '
---------------------------------------------------------------------------------------------------
-- M A I N P R O C E S S I N G
---------------------------------------------------------------------------------------------------
-- Remove Backspace characters
select @string = replace(@string,char(8),@replacement)
-- Remove Tabs
select @string = replace(@string,char(9),@replacement)
-- Remove line feed
select @string = replace(@string,char(10),@replacement)
-- Remove carriage return
select @string = replace(@string,char(13),@replacement)
-- Condense multiple spaces into a single space
-- This works by changing all double spaces to be OX where O = a space, and X = a special character
-- then all occurrences of XO are changed to O,
-- then all occurrences of X are changed to nothing, leaving just the O which is actually a single space
select @string = replace(replace(replace(ltrim(rtrim(@string)),' ', ' ' + char(7)),char(7)+' ',''),char(7),'')
-- Parse each character, remove non alpha-numeric
select @len = len(@string)
WHILE (@count <= @len)
BEGIN
-- Examine the character
select @char = substring(@string,@count,1)
IF (@char like '[a-z]') or (@char like '[A-Z]') or (@char like '[0-9]')
select @newstring = @newstring + @char
ELSE
select @newstring = @newstring + @replacement
select @count = @count + 1
END
return @newstring
END
GO
IF (object_id('dbo.fn_CleanString') IS NOT NULL)
PRINT 'Function created.'
ELSE
PRINT 'Function NOT created.'
GO
Veo que cada uno está recomendando funciones. \t Me gusta la idea de utilizar una función definida por el usuario, pero luego tiene que pasar por control de cambios para llegar al entorno de producción. No hay forma de tener una función en línea en la consulta, ¿verdad? No estoy seguro de qué idioma están utilizando para llamar a la consulta SQL, tal vez VBScript o Powershell, pero ahora estoy pensando que será mucho más fácil hacer la extracción en ese idioma. – NealWalters
Al igual que una tabla de números o una tabla de calendario, o funciones que dividen o concatenan cadenas, una función que puede hacer este tipo de cosas es un módulo útil para tener cerca. Incluso si no llega inmediatamente, debería considerar tener estas cosas en una base de datos de servicios públicos. No sé si realizar esto en el código siempre es la mejor respuesta, especialmente si múltiples aplicaciones diferentes necesitan hacer lo mismo ... –
@Alex K., me gusta más esta solución que la mía. Nunca me gustó tener que examinar la cuerda un personaje a la vez.¿Tiene alguna forma de reemplazar espacios adicionales y caracteres especiales (cr/lf, tabulación) también? – datagod