2016-03-02 157 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瞭解一些選項。