2016-03-02 158 views
1

我试图让下面的正则表达式的工作:等效正则表达式标记

^[a-zA-Z][a-zA-Z ''.-]+[a-zA-Z]$ 

应该允许任何阿尔法,空间,撇号,句号和连字符,只要作为开始和最后的字符作为阿尔法。

John  - ok 
John Smith - ok 
John-Smith - ok 
John.Smith - ok 
.John Smith - not ok 
John Smith. - not ok 

当我使用这个在T-SQL它似乎不工作,我不知道,如果它的输入开始/结束标记不在T-SQL兼容。如何翻译这有效的T-SQL ?:

CREATE Function [dbo].[IsValidName](@value VarChar(MAX)) 
RETURNS INT 
AS 
Begin 
    DECLARE @temp INT 

    SET @temp = (
     SELECT     
      CASE WHEN @value LIKE '%^[a-zA-Z][a-zA-Z ''.-]+[a-zA-Z]$%' THEN 1   
      ELSE 0 
     END  
    ) 


    RETURN @Temp 
End 
+1

LIKE运算符不使用正则表达式。它使用了一组更有限的通配符。除此之外,没有'^','$'或'+'的等价物。看看文档[这里](https://msdn.microsoft.com/en-us/library/ms179859.aspx)或[这里](https://technet.microsoft.com/en-us/library /ms187489(v=sql.105).aspx)。如果您想要完整的正则表达式支持,您可能必须使用CLR函数或过程。 –

回答

0

我做出这样的事情来擦洗数据,除去非字母字符,我稍微修改它来满足您的需求

CREATE Function [dbo].Func (@Temp VarChar(1000)) 
Returns VarChar(1000) 
AS 
BEGIN 
DECLARE @Len INT = LEN(@Temp) 
DECLARE @RETURN INT 
Declare @KeepValues as varchar(50) 
Set @KeepValues = '%[^a-z^ ]%' 
IF PatIndex(@KeepValues, @Temp) = 1 
BEGIN 
    Set @RETURN = 0 
END 
IF PATINDEX(@KeepValues, @Temp) = @Len 
BEGIN 
    SET @RETURN = 0 
END 
IF PATINDEX(@KeepValues, @Temp) = 0 
SET @RETURN = 1 
IF @RETURN IS NULL 
BEGIN 
    SET @Return = 1 
END 
RETURN @RETURN 
END 

这是假设你就不需要做任何类型的数据擦洗受限制的角色。如果您需要扫描限制字符,请告知我们可以在其中添加一些内容,但根据您的数据集,这将返回正确答案

2

T-SQL不支持正则表达式“开箱即用”。根据您使用的环境,有不同的解决方案,但没有一个可能是“纯粹的T-SQL”。在Microsoft环境中,您可以使用CLR过程来实现此目的。

请参阅SQL Server Regular expressions in T-SQL了解一些选项。