2009-11-30 13 views
10

Bất kỳ ai biết cách tốt để xóa dấu chấm câu khỏi một trường trong SQL Server?Máy chủ SQL: Làm thế nào để bạn loại bỏ dấu chấm câu khỏi một trường?

Tôi đang nghĩ đến

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

nhưng nó có vẻ hơi tẻ nhạt khi tôi có ý định về loại bỏ một số lượng lớn các nhân vật khác nhau ví dụ:! @ # $%^& *() <>:"

Cảm ơn trước

Trả lời

15

Tốt nhất, bạn sẽ làm điều này bằng ngôn ngữ ứng dụng như C# + LINQ như đã đề cập ở trên.

Nếu bạn muốn làm điều đó hoàn toàn trong T-SQL, một cách khiến mọi thứ trở nên dễ dàng hơn trước hết là tạo một bảng chứa tất cả các dấu chấm câu bạn muốn xóa.

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

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

Tiếp theo, bạn có thể tạo hàm trong SQL để xóa tất cả ký hiệu dấu câu khỏi chuỗi đầu vào.

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 

Sau đó, bạn chỉ có thể gọi hàm trong câu lệnh UPDATE của bạn

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

@TimC: Cảm ơn rất nhiều Tôi thích giải pháp này và đã triển khai giải pháp này, nhưng đã nảy sinh một vấn đề. Khi tôi lấy dấu chấm câu, tôi dự định sử dụng nó trong một cột được tính toán được duy trì để tôi có thể tạo một Chỉ mục Toàn văn trên đó. Tuy nhiên tôi không thể tồn tại cột sử dụng phương pháp này. Ý tưởng nào? –

3

Bạn có thể sử dụng biểu thức thông thường trong SQL server - đây là một bài viết dựa trên SQL 2005:

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

+0

Có thể CLR không thể sử dụng trong môi trường của bạn – gbn

+0

@Sohnee - cảm ơn bạn đã trả lời nhanh. Tôi chưa thử phương pháp này, bởi vì tôi cần sử dụng dữ liệu này trong Chỉ mục Toàn văn, và tôi đang nghĩ nếu tôi sử dụng nó, tôi sẽ không thể làm cho cột bền bỉ. Đúng không? Mặc dù tôi chắc chắn sẽ thử một cái gì đó như thế vào lần tới 'khả thi của nó. Cảm ơn. –

0

Nếu đó là điều một lần, tôi sẽ sử dụng đoạn mã C# + LINQ trong LINQPad để thực hiện công việc với cụm từ thông dụng.

Thật nhanh chóng và dễ dàng và bạn không phải trải qua quá trình thiết lập quy trình lưu trữ CLR và sau đó tự dọn dẹp sau chính mình.

+0

Cảm ơn rất nhiều, nó không phải là một trong những điều trong trường hợp này, nhưng đó là một công cụ tìm kiếm tốt cho tôi để sử dụng trong tương lai. Chúc mừng. –

1

Tôi sẽ bọc nó trong UDF vô hướng đơn giản để tất cả việc làm sạch chuỗi ở một nơi nếu cần thiết lại.

Sau đó, bạn có thể sử dụng nó trên INSERT quá ...

6

Tôi đề xuất 2 giải pháp

Giải pháp 1: Tạo một bảng tiếng ồn và thay thế tiếng ồn với các không gian trống

ví dụ

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 

Giải pháp 2: Với một bảng số

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) 

Output (Cả hai trường hợp)

liệu

hello how are u . I am ok . Oh nice 

Lưu ý- Tôi vừa mới đặt một số tiếng ồn. Bạn có thể cần phải đặt các tiếng ồn mà bạn cần.

Hope this helps

+0

@pewned. Cảm ơn rất nhiều. Tôi đã kết thúc bằng cách sử dụng một ý tưởng khác, nhưng điều này làm việc và trả lời câu hỏi của tôi. Một câu hỏi cho bạn mặc dù, tôi cần phải sử dụng dữ liệu này trong một cột tính toán đó là tồn tại, nhưng tôi không thể tồn tại nó ở đó. Ý tưởng nào? Tôi có thể sẽ đưa ra một câu hỏi mới cho việc này. Cảm ơn một lần nữa. –

0

bạn không thể sử dụng PATINDEX để chỉ bao gồm số và chữ thay vì cố gắng đoán những gì có thể là dấu chấm câu trong lĩnh vực này? (Không cố gắng để được snarky, nếu tôi đã có mã sẵn sàng, tôi muốn chia sẻ nó ... nhưng đây là những gì tôi đang tìm kiếm).

Có vẻ như bạn cần phải tạo ra một chức năng tùy chỉnh để tránh một danh sách khổng lồ thay thế chức năng trong các truy vấn của bạn - đây là một ví dụ điển hình:

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

9

tôi muốn tránh tạo ra một bảng và muốn để xóa mọi thứ trừ chữ cái và chữ số.

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

Neat lừa nhưng nó là hai lần như chậm như một loạt các thay thế ... – Chris