2009-11-30 18 views
10

¿Alguien sabe una buena manera de eliminar la puntuación de un campo en SQL Server?Servidor SQL: ¿cómo se elimina la puntuación de un campo?

estoy pensando

UPDATE tblMyTable SET FieldName = REPLACE(REPLACE(REPLACE(FieldName,',',''),'.',''),'''' ,'') 

pero parece un poco tedioso cuando tengo la intención de eliminar un gran número de diferentes caracteres, por ejemplo:! @ # $%^& *() <>:"

Gracias de antemano

Respuesta

15

Lo ideal sería hacerlo en un idioma de la aplicación como C# + LINQ como se mencionó anteriormente.

Sin embargo, si quería hacerlo puramente en T-SQL, una forma de hacer las cosas más ordenadas sería crear primero una tabla que retuviera todos los signos de puntuación que desea eliminar.

CREATE TABLE Punctuation 
(
    Symbol VARCHAR(1) NOT NULL 
) 

INSERT INTO Punctuation (Symbol) VALUES('''') 
INSERT INTO Punctuation (Symbol) VALUES('-') 
INSERT INTO Punctuation (Symbol) VALUES('.') 

A continuación, puede crear una función en SQL para eliminar todos los símbolos de puntuación de una cadena de entrada.

CREATE FUNCTION dbo.fn_RemovePunctuation 
(
    @InputString VARCHAR(500) 
) 
RETURNS VARCHAR(500) 
AS 
BEGIN 
    SELECT 
     @InputString = REPLACE(@InputString, P.Symbol, '') 
    FROM 
     Punctuation P 

    RETURN @InputString 
END 
GO 

A continuación, puede simplemente llamar a la función en su instrucción UPDATE

UPDATE tblMyTable SET FieldName = dbo.fn_RemovePunctuation(FieldName) 
+0

@TimC: muchas gracias. Me gustó esta solución y la implementé, pero surgió un problema. Una vez que elimine la puntuación, tengo la intención de usarla en una columna calculada que persista para poder crear un Índice de texto completo en ella. Sin embargo, no puedo persistir en la columna que usa este método. ¿Algunas ideas? –

3

se pueden utilizar expresiones regulares en SQL Server - aquí es un artículo basado en SQL 2005:

http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

+0

Es posible que CLR no se pueda utilizar en su entorno – gbn

+0

@Sohnee - gracias por la respuesta rápida. Todavía no he probado este método, porque necesito usar esta información en un Índice de texto completo, y estoy pensando que si uso esto no podré hacer que la columna sea persistente. ¿Es eso correcto? Aunque definitivamente voy a intentar algo así la próxima vez es 'factible'. Gracias. –

0

Si se trata de algo único, usaría un fragmento de C# + LINQ en LINQPad para hacer el trabajo con expresiones regulares.

Es rápido y fácil y no tiene que pasar por el proceso de configuración de un procedimiento CLR almacenado y luego limpiarlo usted mismo.

+0

Muchas gracias, no es algo así en este caso, pero es una buena herramienta para usar en el futuro. Aclamaciones. –

1

Me gustaría envolverlo en un UDF escalar simple por lo que toda la limpieza de la cadena está en un lugar si es necesario de nuevo.

A continuación, puede usarlo en INSERT también ...

6

que propongo 2 soluciones

Solución 1: Asegúrese una mesa de ruido y reemplazar los ruidos con espacios en blanco

por ejemplo

DECLARE @String VARCHAR(MAX) 
DECLARE @Noise TABLE(Noise VARCHAR(100),ReplaceChars VARCHAR(10)) 
SET @String = 'hello! how * > are % u (: . I am ok :). Oh nice!' 

INSERT INTO @Noise(Noise,ReplaceChars) 
SELECT '!',SPACE(1) UNION ALL SELECT '@',SPACE(1) UNION ALL 
SELECT '#',SPACE(1) UNION ALL SELECT '$',SPACE(1) UNION ALL 
SELECT '%',SPACE(1) UNION ALL SELECT '^',SPACE(1) UNION ALL 
SELECT '&',SPACE(1) UNION ALL SELECT '*',SPACE(1) UNION ALL 
SELECT '(',SPACE(1) UNION ALL SELECT ')',SPACE(1) UNION ALL 
SELECT '{',SPACE(1) UNION ALL SELECT '}',SPACE(1) UNION ALL 
SELECT '<',SPACE(1) UNION ALL SELECT '>',SPACE(1) UNION ALL 
SELECT ':',SPACE(1) 

SELECT @String = REPLACE(@String, Noise, ReplaceChars) FROM @Noise 
SELECT @String Data 

Solución 2: Con una tabla de números

DECLARE @String VARCHAR(MAX) 
SET @String = 'hello! & how * > are % u (: . I am ok :). Oh nice!' 

;with numbercte as 
(
select 1 as rn 
union all 
select rn+1 from numbercte where rn<LEN(@String) 
) 
select REPLACE(FilteredData,'&#x20;',SPACE(1)) Data from 
(select SUBSTRING(@String,rn,1) 
from numbercte 
where SUBSTRING(@String,rn,1) not in('!','*','>','<','%','(',')',':','!','&','@','#','$') 

for xml path(''))X(FilteredData) 

de salida (dos casos)

datos

hello how are u . I am ok . Oh nice 

Nota: Acabo de poner algunos de los ruidos. Es posible que necesite poner los ruidos que necesita.

Esperanza esto ayuda

+0

@pewned. Muchas gracias. Terminé usando una idea diferente, pero funcionó y respondió mi pregunta. Sin embargo, una pregunta para usted, necesito usar esta información en una columna calculada que se conserva, pero no puedo mantenerla allí. ¿Algunas ideas? Probablemente haga una nueva pregunta para esto. Gracias de nuevo. –

0

No se puede utilizar PATINDEX para incluir sólo números y letras en lugar de tratar de adivinar lo que podría ser puntuacion en el campo? (No tratando de ser sarcástico, si tuviera el código listo, lo compartiría ... pero esto es lo que estoy buscando).

parece que necesita para crear una función personalizada con el fin de evitar una lista gigante de reemplazar las funciones en sus consultas - aquí es un buen ejemplo:

http://www.codeproject.com/KB/database/SQLPhoneNumbersPart_2.aspx?display=Print

9

que quería evitar la creación de una mesa y quería para eliminar todo, excepto letras y dígitos.

DECLARE @p int 
DECLARE @Result Varchar(250) 
DECLARE @BadChars Varchar(12) 
SELECT @BadChars = '%[^a-z0-9]%' 
-- to leave spaces - SELECT @BadChars = '%[^a-z0-9] %' 

SET @Result = @InStr 

SET @P =PatIndex(@BadChars,@Result) 
WHILE @p > 0 BEGIN 
    SELECT @Result = Left(@Result,@p-1) + Substring(@Result,@p+1,250) 
    SET @P =PatIndex(@BadChars,@Result) 
    END 
+0

Buen truco pero es dos veces más lento que un montón de reemplazos ... – Chris

Cuestiones relacionadas