2015-06-25 12 views
7

Chcę skopiować cały wiersz w nowej kolumnie, zastępując wszystkie znaki specjalne znakami -. mój kod jest poniżej.Znajdź i zamień wszystkie znaki specjalne w SQL

Mój projekt stół

enter image description here

select * from mycode 
    UPDATE mycode 
    SET newName = Replace(myname, '%[^0-9a-zA-Z]%', '-') 

Robi kopię z mojego kodu, ale szczególnym charakterze nie otrzymują

Wynik enter image description here

+2

niestety nie ma czegoś takiego jak regex zastąpić. Życzysz sobie, aby kiedyś microsoft dodał tę funkcję ... –

+1

może to pomóc http://stackoverflow.com/questions/1007697/how-to-strip-all-non-alphabetic-characters- from-string-in-sql-server – Sachin

+2

Cóż, nie ma RegEx, który jest fabrycznie zainstalowany. Można jednak zainstalować funkcje RegEx 'CLR'. Wytyczne można znaleźć tutaj: https://www.simple-talk.com/sql/t-sql-programming/clr-assembly-regex-functions-for-sql-server-by-example/ Zwykle uważam je za bardzo przydatne , przynajmniej zastąp. –

Odpowiedz

4

Spróbuj utworzyć tę funkcję

create function dbo.RemoveSpecialChars (@s varchar(256)) returns varchar(256) 
    with schemabinding 
begin 
    if @s is null 
     return null 
    declare @s2 varchar(256) 
    set @s2 = '' 
    declare @l int 
    set @l = len(@s) 
    declare @p int 
    set @p = 1 
    while @p <= @l begin 
     declare @c int 
     set @c = ascii(substring(@s, @p, 1)) 
     if @c between 48 and 57 or @c between 65 and 90 or @c between 97 and 122 
     set @s2 = @s2 + char(@c) 
     set @p = @p + 1 
     end 
    if len(@s2) = 0 
     return null 
    return @s2 
    end 

a następnie zrobić swoje UPDATE

UPDATE mycode 
    SET newName = dbo.RemoveSpecialChars(mycode) 
+0

Nie uzyskanie wyniku można zrobić bez funkcji –

+0

Dzięki! To działało idealnie. Czy to również usuwa znaki TM i znaki dotyczące praw autorskich? – eripey

5

Spróbuj tego zapytania

DECLARE @specialchar varchar(15) 
DECLARE @getspecialchar CURSOR 
SET @getspecialchar = CURSOR FOR 
SELECT DISTINCT poschar 
    FROM MASTER..spt_values S 
      CROSS APPLY (SELECT SUBSTRING(newName ,NUMBER,1) AS poschar from mycode) t 
    WHERE NUMBER > 0 

      AND NOT (ASCII(t.poschar) BETWEEN 65 AND 90 
        OR ASCII(t.poschar) BETWEEN 97 AND 122 
        OR ASCII(t.poschar) BETWEEN 48 AND 57) 

OPEN @getspecialchar 
FETCH NEXT 
FROM @getspecialchar INTO @specialchar 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    UPDATE mycode 
     SET newName =Replace(myname,@specialchar,'') 
FETCH NEXT 
FROM @getspecialchar INTO @specialchar 
END 
CLOSE @getspecialchar 
DEALLOCATE @getspecialchar 
+0

Mukesh kalgude: dwa głosy dają odpowiedź, ale nie otrzymuję wyniku –