簡體   English   中英

SQL Server 2008中的正則表達式

[英]Regular expressions in SQL Server 2008

如何編寫此檢查約束:

[AB] + ,varchar列,非空字符串由A或B組成。

有些限制確實有效,但這種情況並非如此。
整理或其他問題?

SQL Server本身不支持Regex。

但是,可以添加檢查約束以匹配您提供的模式

not like '%[^AB]%'

測試:

declare @Test table(TestColumn varchar(100) check (TestColumn not like '%[^AB]%' and TestColumn != ''))

insert @Test
values ('AABAB')  -- passed

insert @Test
values ('AAB')    -- passed

insert @Test
values ('AABC')   -- failed  

insert @Test
values ('')  -- failed

LIKE模式非常有限。 如果您需要真正的Regex約束,您可以實現非常簡單的CLR功能。 互聯網上有很多例子。 例如: 正則表達式使模式匹配和數據提取更容易

SQL Server 2008本身不支持正則表達式。 您可以編寫一個自定義CLR用戶定義函數來執行此操作。 MSDN擁有豐富的資源來指導您完成創建過程。 以這篇文章為例。

此外, 本文似乎准確涵蓋了您要對檢查約束做什么。 它演示了如何將CLR UDF設置為檢查約束。

如果要在MSSQL約束中使用完整功能正則表達式 - 您需要編寫自定義DLL並將其附加到sql server。 然后你就可以將它注冊為本地函數並以任何你喜歡的方式使用regext。

請參閱http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.80).aspx

如果您對此有困難 - 我可以發布一個為MSSQL工作clr庫的簡單示例

如果使用上面其他人給出的Check約束(即[AB] [AB]等),則不能讓您靈活地正確測試varchar值,那么您可以嘗試使用觸發器。

觸發器將允許您更徹底地測試您的后續內容。

使用觸發器測試跨表的業務規則時,請參閱此鏈接上的示例C,只需更改它以適應您需要執行的測試:)

希望這可以幫助

示例代碼可幫助您更改測試以滿足您的需求

CREATE TABLE [dbo].[TestTrigger](
    [stringtest] [varchar](100) NULL
) ON [PRIMARY]
GO

CREATE TRIGGER [dbo].[TestTrigger_TestAB] 
    ON [dbo].[TestTrigger] 
    FOR INSERT,UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @testString varchar(100)
    Declare @Len as int;
    Declare @SearchPattern as varchar(8000);
    Declare @Result as Int;

    SELECT @testString = stringtest FROM inserted

    Select @Len = Len(@testString);

    While @Len>0
    Begin
        Select @SearchPattern = Isnull(@SearchPattern,'') + '[A-B]';
        Select @Len = @Len -1;
    End

    Select @Result = Case When @testString Like @SearchPattern Then 1 Else 0 End;

    IF (@Result = 0)
    BEGIN
        RAISERROR ('Value entered did not contain only A or B', 16, 1)
        ROLLBACK TRANSACTION
    END
END


SET ANSI_PADDING OFF
GO
SELECT * FROM t
WHERE REPLACE(REPLACE(col, 'A', ''), 'B', '') = ''

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM