Регулярные выражения в SQL Server 2008 - PullRequest
2 голосов
/ 19 июня 2011

Как написать это контрольное ограничение:

[AB] + , столбец varchar с непустыми строками, состоящими из A или B.

Некоторые ограничения работают, этот простой - нет.
Проблема с сопоставлением или как?

Ответы [ 5 ]

7 голосов
/ 19 июня 2011

SQL-сервер не поддерживает 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. В интернете множество примеров. Например: Регулярные выражения упрощают сопоставление с образцом и извлечение данных .

2 голосов
/ 19 июня 2011

SQL Server 2008 изначально не поддерживает регулярные выражения. Вы можете написать собственную пользовательскую функцию CLR, которая делает это. MSDN имеет множество ресурсов, которые помогут вам в процессе его создания. Это статья , например.

Кроме того, эта статья , кажется, в точности описывает, что вы хотите делать с проверочными ограничениями. Он демонстрирует, как вы можете установить CLR UDF в качестве вашего проверочного ограничения.

1 голос
/ 19 июня 2011

Если использовать проверочное ограничение, данное другими выше (например, [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
1 голос
/ 19 июня 2011

Если вы хотите использовать регулярное выражение с полной функциональностью в ограничении MSSQL - вам нужно написать пользовательскую dll и присоединить ее к серверу sql. тогда вы сможете зарегистрировать ее как локальную функцию и использовать ее как угодно.

см. http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.80).aspx.

Если у вас есть трудности с этим - я могу опубликовать простой пример работы библиотеки clr для MSSQL

0 голосов
/ 19 июня 2011
SELECT * FROM t
WHERE REPLACE(REPLACE(col, 'A', ''), 'B', '') = ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...