回答

293

試試這個功能:

Create Function [dbo].[RemoveNonAlphaCharacters](@Temp VarChar(1000)) 
Returns VarChar(1000) 
AS 
Begin 

    Declare @KeepValues as varchar(50) 
    Set @KeepValues = '%[^a-z]%' 
    While PatIndex(@KeepValues, @Temp) > 0 
     Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '') 

    Return @Temp 
End 

這樣稱呼它:

Select dbo.RemoveNonAlphaCharacters('abc1234def5678ghi90jkl') 

一旦你理解的代碼,你應該看到,這是比較簡單的改變它刪除其他字符,太。你甚至可以使這種動態足以傳遞你的搜索模式。

希望它有幫助。

+2

油滑。比我的簡單得多。 – 2009-06-17 18:17:02

+0

這是一個很棒的實現 – SQLMenace 2009-06-17 18:39:37

+9

這段代碼刪除非字母字符(因此數字也被刪除)。如果您想要離開數字(刪除非字母數字字符),則... 用^ a-z ^代替^ a-z 0-9 該搜索字符串出現在兩個不同位置的代碼中。一定要替換它們兩個。 – 2009-06-17 18:51:53

5

我知道SQL在字符串操作上很糟糕,但我不認爲這會很困難。這是一個簡單的功能,可以去除字符串中的所有數字。會有更好的方法來做到這一點,但這是一個開始。

CREATE FUNCTION dbo.AlphaOnly (
    @String varchar(100) 
) 
RETURNS varchar(100) 
AS BEGIN 
    RETURN (
    REPLACE(
     REPLACE(
     REPLACE(
      REPLACE(
      REPLACE(
       REPLACE(
       REPLACE(
        REPLACE(
        REPLACE(
         REPLACE(
         @String, 
         '9', ''), 
        '8', ''), 
        '7', ''), 
       '6', ''), 
       '5', ''), 
      '4', ''), 
      '3', ''), 
     '2', ''), 
     '1', ''), 
    '0', '') 
) 
END 
GO 

-- ================== 
DECLARE @t TABLE (
    ColID  int, 
    ColString varchar(50) 
) 

INSERT INTO @t VALUES (1, 'abc1234567890') 

SELECT ColID, ColString, dbo.AlphaOnly(ColString) 
FROM @t 

輸出

ColID ColString 
----- ------------- --- 
    1 abc1234567890 abc 

第2輪 - 數據驅動黑名單

-- ============================================ 
-- Create a table of blacklist characters 
-- ============================================ 
IF EXISTS (SELECT * FROM sys.tables WHERE [object_id] = OBJECT_ID('dbo.CharacterBlacklist')) 
    DROP TABLE dbo.CharacterBlacklist 
GO 
CREATE TABLE dbo.CharacterBlacklist (
    CharID    int   IDENTITY, 
    DisallowedCharacter nchar(1) NOT NULL 
) 
GO 
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'0') 
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'1') 
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'2') 
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'3') 
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'4') 
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'5') 
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'6') 
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'7') 
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'8') 
INSERT INTO dbo.CharacterBlacklist (DisallowedCharacter) VALUES (N'9') 
GO 

-- ==================================== 
IF EXISTS (SELECT * FROM sys.objects WHERE [object_id] = OBJECT_ID('dbo.StripBlacklistCharacters')) 
    DROP FUNCTION dbo.StripBlacklistCharacters 
GO 
CREATE FUNCTION dbo.StripBlacklistCharacters (
    @String nvarchar(100) 
) 
RETURNS varchar(100) 
AS BEGIN 
    DECLARE @blacklistCt int 
    DECLARE @ct   int 
    DECLARE @c   nchar(1) 

    SELECT @blacklistCt = COUNT(*) FROM dbo.CharacterBlacklist 

    SET @ct = 0 
    WHILE @ct < @blacklistCt BEGIN 
    SET @ct = @ct + 1 

    SELECT @String = REPLACE(@String, DisallowedCharacter, N'') 
    FROM dbo.CharacterBlacklist 
    WHERE CharID = @ct 
    END 

    RETURN (@String) 
END 
GO 

-- ==================================== 
DECLARE @s nvarchar(24) 
SET @s = N'abc1234def5678ghi90jkl' 

SELECT 
    @s     AS OriginalString, 
    dbo.StripBlacklistCharacters(@s) AS ResultString 

輸出

OriginalString   ResultString 
------------------------ ------------ 
abc1234def5678ghi90jkl abcdefghijkl 

我向讀者提出的挑戰:您能否提高效率?使用遞歸怎麼樣?

+0

你可以寫一個更好的dbo.StripBlacklistCharacters()而不用循環使用http://www.sommarskog.se/arrays-in-sql-2005.html#tblnum表中的數字加入你的黑名單表,但我今天懶得自己試試.... – 2009-06-17 19:59:06

128

G Mastros'awesome answer參數版本:

CREATE FUNCTION [dbo].[fn_StripCharacters] 
(
    @String NVARCHAR(MAX), 
    @MatchExpression VARCHAR(255) 
) 
RETURNS NVARCHAR(MAX) 
AS 
BEGIN 
    SET @MatchExpression = '%['[email protected]+']%' 

    WHILE PatIndex(@MatchExpression, @String) > 0 
     SET @String = Stuff(@String, PatIndex(@MatchExpression, @String), 1, '') 

    RETURN @String 

END 

字母:只在

SELECT dbo.fn_StripCharacters('[email protected]#f4$', '^a-z') 

數字:

SELECT dbo.fn_StripCharacters('[email protected]#f4$', '^0-9') 

只有字母數字:

SELECT dbo.fn_StripCharacters('[email protected]#f4$', '^a-z0-9') 

非字母數字:

SELECT dbo.fn_StripCharacters('[email protected]#f4$', 'a-z0-9') 
1

我把這個兩個地方PATINDEX被調用。

PatIndex('%[^A-Za-z0-9]%', @Temp) 

以上RemoveNonAlphaCharacters自定義函數,並更名爲RemoveNonAlphaNumericCharacters

-1

雖然職位是有點老了,我想講以下幾點。 問題我與上述方案是,它不會過濾掉字符,如C,E,I,等我適應一個函數,如下所示(I只用一個80的varchar串,以節省存儲器):

create FUNCTION dbo.udf_Cleanchars (@InputString varchar(80)) 
RETURNS varchar(80) 
AS 

BEGIN 
declare @return varchar(80) , @length int , @counter int , @cur_char char(1) 
SET @return = '' 
SET @length = 0 
SET @counter = 1 
SET @length = LEN(@InputString) 
IF @length > 0 
BEGIN WHILE @counter <= @length 

BEGIN SET @cur_char = SUBSTRING(@InputString, @counter, 1) IF ((ascii(@cur_char) in (32,44,46)) or (ascii(@cur_char) between 48 and 57) or (ascii(@cur_char) between 65 and 90) or (ascii(@cur_char) between 97 and 122)) 
BEGIN SET @return = @return + @cur_char END 
SET @counter = @counter + 1 
END END 

RETURN @return END 
3

如果您像我一樣,無法只爲生產數據添加功能,但仍希望執行此類過濾,那麼使用PIVOT表格將純粹的SQL解決方案重新放回到一起。

N.B.我將表格硬編碼爲最多40個字符,如果您有更長的字符串進行過濾,則必須添加更多字符。

SET CONCAT_NULL_YIELDS_NULL OFF; 

with 
    ToBeScrubbed 
as (
    select 1 as id, '*SOME [email protected] [email protected]* #* BOGUS [email protected]*&! DATA' as ColumnToScrub 
), 

Scrubbed as (
    select 
     P.Number as ValueOrder, 
     isnull (substring (t.ColumnToScrub , number , 1) , '') as ScrubbedValue, 
     t.id 
    from 
     ToBeScrubbed t 
     left join master..spt_values P 
      on P.number between 1 and len(t.ColumnToScrub) 
      and type ='P' 
    where 
     PatIndex('%[^a-z]%', substring(t.ColumnToScrub,P.number,1)) = 0 
) 

SELECT 
    id, 
    [1]+ [2]+ [3]+ [4]+ [5]+ [6]+ [7]+ [8] +[9] +[10] 
    + [11]+ [12]+ [13]+ [14]+ [15]+ [16]+ [17]+ [18] +[19] +[20] 
    + [21]+ [22]+ [23]+ [24]+ [25]+ [26]+ [27]+ [28] +[29] +[30] 
    + [31]+ [32]+ [33]+ [34]+ [35]+ [36]+ [37]+ [38] +[39] +[40] as ScrubbedData 
FROM (
    select 
     * 
    from 
     Scrubbed 
    ) 
    src 
    PIVOT (
     MAX(ScrubbedValue) FOR ValueOrder IN (
     [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], 
     [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], 
     [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], 
     [31], [32], [33], [34], [35], [36], [37], [38], [39], [40] 
     ) 
    ) pvt 
2

這是一種非常笨重的方式,將所有不想出來的角色都帶走。問題是你必須指定你不想要的字符。如果一個新角色進入你,它會通過,除非你將它添加到列表中。

好處是您不必創建特殊功能。我沒有寫權限,所以這使我能夠從簡單的查詢中運行。

REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
p.Name 
,'®','') 
,'©','') 
,'ö','o') 
,'ë','e') 
,'ä','a') 
,'ü','u') 
,'ú','u') 
,'í','i') 
,'ï','i') 
,'™','') 
,'é','e') 
,'²','2') 
,'è','e') 
,'—','-') 
,'–','-') 
,'ó','o') 
,'•',' ') 
,'…','.') 
,'ô','o') 
,'â','a') 
,'á','a') 
,'ê','e') 
,'è','e') 
,'’',' ') 
,'·',' ') 
,'à','a') 
,'å','a') 
,'ã','a') 
,'’',' ') 
,'a€s','as') 
,'ø','o') 
,'ñ','n') 
,'î','i') 
,'ç','c') 
,'Ç','C') 
,'Ã','A') 
,'」','"') 
,'「','"') 
,'Á','A') 
,'¢','c') 
,'Ã','A') 
,'Å','A') 
,'¶','S') 
,'×','x') 
,'†','') 
,'š','') 
,'¤','') 
,'µ','') 
,'õ','') 
,'€','') 
,'‘','') 
,'Õ','') 
,'ð','') 
,'Ò','') 
,'¨','') 
,'º','') 
,'°','') 
,'ì','') 
,'ƒ','') 
,'ÿ','') 
,'ß','') 
,'«','') 
,'»','') 
,'Æ','') 
,'¬','') 
,'Ù','') 
,'ý','') 
,'û','') 
,'|','') 
    as Name 
-3

我剛剛發現這內置於Oracle 10g,如果這是你正在使用。我不得不將所有特殊字符去掉一個電話號碼比較。

regexp_replace(c.phone, '[^0-9]', '') 
0

使用CTE生成的數字表,檢查每個字符,然後FOR XML到Concat的到,你可以保持的字符串值...

CREATE FUNCTION [dbo].[PatRemove](
    @pattern varchar(50), 
    @expression varchar(8000) 
    ) 
RETURNS varchar(8000) 
AS 
BEGIN 
    WITH 
     d(d) AS (SELECT d FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) digits(d)), 
     nums(n) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM d d1, d d2, d d3, d d4), 
     chars(c) AS (SELECT SUBSTRING(@expression, n, 1) FROM nums WHERE n <= LEN(@expression)) 
    SELECT 
     @expression = (SELECT c AS [text()] FROM chars WHERE c NOT LIKE @pattern FOR XML PATH('')); 

    RETURN @expression; 
END 
2

該解決方案,艾倫先生的解決方案的啓發,需要一個Numbers整數表(如果您想要以良好的性能進行嚴肅的查詢操作,您應該手頭有這個表)。它不需要CTE。您可以更改NOT IN (...)表達式以排除特定字符,或者將其更改爲IN (...)LIKE表達式以僅保留某些字符。

SELECT (
    SELECT SUBSTRING([YourString], N, 1) 
    FROM dbo.Numbers 
    WHERE N > 0 AND N <= CONVERT(INT, LEN([YourString])) 
     AND SUBSTRING([YourString], N, 1) NOT IN ('(',')',',','.') 
    FOR XML PATH('') 
) AS [YourStringTransformed] 
FROM ... 
2

說完看着所有給定的解決方案,我認爲必須有不需要的功能或CTE/XML查詢純SQL方法,並且不涉及難以維持嵌套REPLACE語句。這裏是我的解決方案:

SELECT 
    x 
    ,CASE WHEN a NOT LIKE '%' + SUBSTRING(x, 1, 1) + '%' THEN '' ELSE SUBSTRING(x, 1, 1) END 
    + CASE WHEN a NOT LIKE '%' + SUBSTRING(x, 2, 1) + '%' THEN '' ELSE SUBSTRING(x, 2, 1) END 
    + CASE WHEN a NOT LIKE '%' + SUBSTRING(x, 3, 1) + '%' THEN '' ELSE SUBSTRING(x, 3, 1) END 
    + CASE WHEN a NOT LIKE '%' + SUBSTRING(x, 4, 1) + '%' THEN '' ELSE SUBSTRING(x, 4, 1) END 
    + CASE WHEN a NOT LIKE '%' + SUBSTRING(x, 5, 1) + '%' THEN '' ELSE SUBSTRING(x, 5, 1) END 
    + CASE WHEN a NOT LIKE '%' + SUBSTRING(x, 6, 1) + '%' THEN '' ELSE SUBSTRING(x, 6, 1) END 
-- Keep adding rows until you reach the column size 
    AS stripped_column 
FROM (SELECT 
     column_to_strip AS x 
     ,'ABCDEFGHIJKLMNOPQRSTUVWXYZ' AS a 
     FROM my_table) a 

做這種方式的優點是有效的字符都包含在子查詢中的一個字符串進行簡單的重新配置爲不同的字符集。

缺點是您必須爲每個字符添加一行SQL,直到列的大小。爲了使這項工作更容易我只是用下面的PowerShell腳本,這個例子中,如果一個VARCHAR(64):

1..64 | % { 
    " + CASE WHEN a NOT LIKE '%' + SUBSTRING(x, {0}, 1) + '%' THEN '' ELSE SUBSTRING(x, {0}, 1) END" -f $_ 
} | clip.exe 
2

下面是不需要創建一個功能或上市字符的所有實例來替代的解決方案。它將遞歸WITH語句與PATINDEX結合使用來查找不需要的字符。它將替換列中的所有不需要的字符 - 任何給定字符串中包含的最多100個唯一的壞字符。 (EG「ABC123DEF234」將包含4個錯誤字符1,2,3和4)100限制是WITH語句允許的最大遞歸次數,但這不會限制要處理的行數,僅受限於可用內存。
如果你不想要DISTINCT結果,你可以從代碼中刪除這兩個選項。

-- Create some test data: 
SELECT * INTO #testData 
FROM (VALUES ('ABC DEF,K.l(p)'),('123H,J,234'),('ABCD EFG')) as t(TXT) 

-- Actual query: 
-- Remove non-alpha chars: '%[^A-Z]%' 
-- Remove non-alphanumeric chars: '%[^A-Z0-9]%' 
DECLARE @BadCharacterPattern VARCHAR(250) = '%[^A-Z]%'; 

WITH recurMain as (
    SELECT DISTINCT CAST(TXT AS VARCHAR(250)) AS TXT, PATINDEX(@BadCharacterPattern, TXT) AS BadCharIndex 
    FROM #testData 
    UNION ALL 
    SELECT CAST(TXT AS VARCHAR(250)) AS TXT, PATINDEX(@BadCharacterPattern, TXT) AS BadCharIndex 
    FROM (
     SELECT 
      CASE WHEN BadCharIndex > 0 
       THEN REPLACE(TXT, SUBSTRING(TXT, BadCharIndex, 1), '') 
       ELSE TXT 
      END AS TXT 
     FROM recurMain 
     WHERE BadCharIndex > 0 
    ) badCharFinder 
) 
SELECT DISTINCT TXT 
FROM recurMain 
WHERE BadCharIndex = 0; 
2

這是另一種使用iTVF刪除非字母字符的方法。首先,你需要一個基於模式的字符串分割器。下面是德韋恩營的article採取一個:

-- PatternSplitCM will split a string based on a pattern of the form 
-- supported by LIKE and PATINDEX 
-- 
-- Created by: Chris Morris 12-Oct-2012 
CREATE FUNCTION [dbo].[PatternSplitCM] 
(
     @List    VARCHAR(8000) = NULL 
     ,@Pattern   VARCHAR(50) 
) RETURNS TABLE WITH SCHEMABINDING 
AS 

RETURN 
    WITH numbers AS (
     SELECT TOP(ISNULL(DATALENGTH(@List), 0)) 
      n = ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) 
     FROM 
     (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) d (n), 
     (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) e (n), 
     (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) f (n), 
     (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) g (n) 
    ) 

    SELECT 
     ItemNumber = ROW_NUMBER() OVER(ORDER BY MIN(n)), 
     Item = SUBSTRING(@List,MIN(n),1+MAX(n)-MIN(n)), 
     [Matched] 
    FROM (
     SELECT n, y.[Matched], Grouper = n - ROW_NUMBER() OVER(ORDER BY y.[Matched],n) 
     FROM numbers 
     CROSS APPLY (
      SELECT [Matched] = CASE WHEN SUBSTRING(@List,n,1) LIKE @Pattern THEN 1 ELSE 0 END 
     ) y 
    ) d 
    GROUP BY [Matched], Grouper 

現在你有一個基於模式的分離器,則需要分割該模式匹配的字符串:

[a-z] 

,然後將它們連接起來回得到期望的結果:

SELECT * 
FROM tbl t 
CROSS APPLY(
    SELECT Item + '' 
    FROM dbo.PatternSplitCM(t.str, '[a-z]') 
    WHERE Matched = 1 
    ORDER BY ItemNumber 
    FOR XML PATH('') 
) x (a) 

SAMPLE

結果:

​​
1

- 第一個創建一個功能

CREATE FUNCTION [dbo].[GetNumericonly] 
(@strAlphaNumeric VARCHAR(256)) 
RETURNS VARCHAR(256) 
AS 
BEGIN 
    DECLARE @intAlpha INT 
    SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric) 
BEGIN 
    WHILE @intAlpha > 0 
    BEGIN 
      SET @strAlphaNumeric = STUFF(@strAlphaNumeric, @intAlpha, 1, '') 
      SET @intAlpha = PATINDEX('%[^0-9]%', @strAlphaNumeric) 
    END 
END 
RETURN ISNULL(@strAlphaNumeric,0) 
END 

現在調用這個函數像

select [dbo].[GetNumericonly]('Abhi12shek23jaiswal') 

其結果就像

1223 
0
DECLARE @vchVAlue NVARCHAR(255) = 'SWP, Lettering Position 1: 4 Ω, 2: 8 Ω, 3: 16 Ω, 4: , 5: , 6: , Voltage Selector, Solder, 6, Step switch, : w/o fuseholder ' 


WHILE PATINDEX('%?%' , CAST(@vchVAlue AS VARCHAR(255))) > 0 
    BEGIN 
    SELECT @vchVAlue = STUFF(@vchVAlue,PATINDEX('%?%' , CAST(@vchVAlue AS VARCHAR(255))),1,' ') 
    END 

SELECT @vchVAlue 
0

,我試圖保持阿拉伯字母我試圖取代常規的表達,但也並沒有以這種方式工作並沒有爲我工作。我寫了另一種方法在ASCII級別上工作,因爲這是我唯一的選擇,並且工作。

Create function [dbo].[RemoveNonAlphaCharacters] (@s varchar(4000)) returns varchar(4000) 
    with schemabinding 
begin 
    if @s is null 
     return null 
    declare @s2 varchar(4000) 
    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 or @c between 165 and 253 or @c between 32 and 33 
     set @s2 = @s2 + char(@c) 
     set @p = @p + 1 
     end 
    if len(@s2) = 0 
     return null 
    return @s2 
    end 

GO

2

信不信由你,在我的系統中,這醜陋的功能執行除G Mastros優雅的更好。

CREATE FUNCTION dbo.RemoveSpecialChar (@s VARCHAR(256)) 
RETURNS VARCHAR(256) 
WITH SCHEMABINDING 
    BEGIN 
     IF @s IS NULL 
      RETURN NULL 
     DECLARE @s2 VARCHAR(256) = '', 
       @l INT = LEN(@s), 
       @p INT = 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 
1

從性能的角度看我會用內聯函數:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE FUNCTION [dbo].[udf_RemoveNumericCharsFromString] 
(
@List NVARCHAR(4000) 
) 
RETURNS TABLE 
AS RETURN 

    WITH GetNums AS (
     SELECT TOP(ISNULL(DATALENGTH(@List), 0)) 
     n = ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) 
     FROM 
      (VALUES (0),(0),(0),(0)) d (n), 
      (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) e (n), 
      (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) f (n), 
      (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) g (n) 
      ) 

    SELECT StrOut = ''+ 
     (SELECT Chr 
     FROM GetNums 
      CROSS APPLY (SELECT SUBSTRING(@List , n,1)) X(Chr) 
     WHERE Chr LIKE '%[^0-9]%' 
     ORDER BY N 
     FOR XML PATH (''),TYPE).value('.','NVARCHAR(MAX)') 


    /*How to Use 
    SELECT StrOut FROM dbo.udf_RemoveNumericCharsFromString ('vv45--9gut') 
    Result: vv--gut 
    */ 
相關問題