2014-03-12 49 views
1

如何在純TSQL中創建標量函數以獲得與C#中的Char.IsLetterOrDigit()相同的結果?TSQL中的Char.IsLetterOrDigit

我需要所有的Unicode的字母和數字,包括特殊字母像ç

UPDATE: 例如,輸入「-S *đčć1ž/」,結果應該是唯一的「šđčć1ž」

+0

所有Unicode字符還有的[ 'UNICODE'](http://technet.microsoft.com/en-us/library/ms180059.aspx)函數來獲取代碼點,但在此之後,你自己。您必須基本上使unicode標準中的表能夠執行查找,因爲沒有公式化的方式來確定它們屬於這些類別。 –

+1

'Char.IsLetterOrDigit'返回一個布爾值,你似乎想要返回一個字符串的東西。你能澄清你真正想要的嗎? –

回答

3

@ LasseV.Karlsen的評論讓我意識到我不得不返工我的代碼,我希望這將工作:

create function [dbo].[f_clense] 
(
    @txt nvarchar(8000) 
) returns nvarchar(8000) 
as 
begin 
declare @firstupperletter char(1)='A' 
declare @lastupperletter char(1)='Z' 
declare @firstlowerletter char(1)='a' 
declare @lastlowerletter char(1)='z' 
declare @firstnumber char(1)='0' 
declare @lastnumber char(1)='9' 
declare @len int = len(@txt) 

while @len > 0 
select @txt = case when @c between @firstupperletter and @lastupperletter 
        or @c between @firstlowerletter and @lastlowerletter 
        or @c between @firstnumber and @lastnumber 
        then @txt 
        else stuff(@txt, @len, 1, '') 
       end, 
     @len += -1 

return @txt 
end 
go 
select [dbo].[f_clense]('abc&d23/') 
+1

+1有沒有原因你沒有先檢查數字? – Paparazzi

+0

@Blam不,我沒有考慮過哪個部分更快。但它最有可能是數字部分。好點 –

+0

由於規範是他想要什麼char.IsLetterOrDigit提供,那麼這是遠不及。有很多unicode代碼點被分類爲字母,但不包含大寫和小寫代碼點。此外,unicode數字不僅僅是0-9。 –

1

如果你想要的結果相同Char.IsLetterOrDigit()在.NET那我就只去CLR我ntegration
我不認爲你會在純TSQL爲此在
現在,你可能只是做一次,填充在SQL表與IsLetterOrDigit

Char.IsLetterOrDigit Method (Char)