2009-11-30 22 views
10

SQL Server'daki bir alandan noktalama işaretlerini kaldırmanın iyi bir yolu var mı?SQL Server: Bir alandan noktalama işaretini nasıl kaldırırsınız?

Ben

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

düşünüyorum ama örneğin farklı karakterlerin çok sayıda kaldırma niyetinde zaman biraz sıkıcı görünüyor! @ # $%^& *() <>:"

peşin

Teşekkür

cevap

15

kullanabilirsiniz.

Sadece T-SQL'de yapmak istiyorsanız, bir şeyi daha önce çıkarmanız gereken tüm noktalama işaretlerini içeren bir tablo oluşturmak için bir şeyler hazırlayın.

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

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

Daha sonra, bir girdi dizesinden tüm noktalama sembolleri kaldırmak için SQL bir işlev oluşturabilir. Bir gürültü tablo yapın ve aralarında boşluk ile sesler değiştirin:

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 

Sonra sadece ben 2 çözümleri

Çözüm 1 öneriyorum

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

@TimC: Çok teşekkürler, bu çözümü beğendim ve uyguladım, ama bir sorunla karşılaştım. Noktalama işaretini çektiğimde, onu kullanarak bir Tam Metin Dizini oluşturabilmem için hesaplanmış bir sütunda kullanmayı düşünüyorum. Ancak, bu yöntemi kullanan sütunu kaldıramıyorum. Herhangi bir fikir? –

3

SQL Server normal ifadeleri kullanabilirsiniz - burada SQL 2005 dayalı bir makale:

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

+0

O CLR ortamınız – gbn

+0

@Sohnee içinde kullanılamaz olabilir - hızlı cevap için teşekkürler. Bu yöntemi henüz denemedim, çünkü bu veriyi Tam Metin Dizini'nde kullanmam gerekiyor ve bunu kullanırsam sütunu kalıcı hale getiremeyeceğimi düşünüyorum. Bu doğru mu? Her ne kadar kesinlikle bir dahaki sefere böyle denemem gerekirse de 'uygulanabilir. Teşekkürler. –

0

Tek seferlik bir şeyse, işi normal ifadelerle yapmak için LINQPad numaralı C# + LINQ snippet'ini kullanırdım.

Bu hızlı ve kolaydır ve CLR saklı yordamını ayarlama ve ardından kendiniz temizlemeyi gerçekleştirme işlemine girmenize gerek yoktur.

+0

Çok teşekkürler, bu durumda bir şey değil, ama gelecekte kullanmak için iyi bir araç. Şerefe. –

1

Basit bir skaler UDF'ye sarmak isterim, böylece tekrar gerekiyorsa tüm dize temizliği bir yerde olur.

Sonra yukarıda da belirtildiği gibi bu tür C# + LINQ gibi bir uygulama dilinde yapardı, İdeal ... çok INSERT üzerinde

6

sizin GÜNCELLEME açıklamada işlevini çağırabilirsiniz

örn.

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 

Çözüm 2: Bir numara tablosunun ile

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) 

Çıktı (olgu Hem)

Veri

hello how are u . I am ok . Oh nice 

Not - Sadece bazı sesleri ekledim. İhtiyacınız olan sesleri koymanız gerekebilir.

Umut bu sadece rakamlar ve harfler yerine noktalama alanında ne olabileceğini tahmin etmeye çalışarak dahil

+0

@pewned. Çok teşekkürler. Farklı bir fikir kullanarak bitti, ama bu çalıştı ve sorumu yanıtladı. Yine de sizin için bir soru, bu verileri kalıcı bir hesaplanmış sütunda kullanmam gerekiyor, ancak orada devam edemiyorum. Herhangi bir fikir? Bunun için muhtemelen yeni bir soru yapacağım. Tekrar teşekkürler. –

9

Ben bir tablo oluşturmaktan kaçınmak istedim ve istediği: Burada iyi bir örnek - Eğer sorgularda işlevlerini yerine dev bir listesini önlemek için özel bir işlevi oluşturmak için gereken gibi

görünüyor Harf ve rakam hariç her şeyi kaldırmak için

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

Düzenli bir hile ama bir çift yedek olarak iki kat daha yavaş ... – Chris