2014-03-12 15 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)