2010-08-31 3 views
2

В SQL Server предполагается, что у столбцов, которые должны иметь один и тот же тип данных, можно определить ограничение проверки в таблице (или уровне базы данных) и применить это к столбцу при его определении?Reusing CHECK CONSTRAINTS

Как в этом (надуманный) Например:

ALTER TABLE dbo.tblAuditTrail 
ADD CONSTRAINT CK_DecimalNumber 
CHECK (DecimalColumn LIKE '^\-?\d+\.\d+$') 
GO 

Как же теперь вы можете связать это с один или несколько столбцов, создав его на уровне таблицы или является ответом на это, чтобы использовать правило именно.

CREATE RULE RU_Decimal 
AS 
@value LIKE '^\-?\d+\.\d+$' 
GO 

Я знаю, что пример надуманный и один будет использовать десятичную столбец для десятичных значений, но предположим, из-за плохой выбор дизайна, что это был NCHAR столбец и вы хотите, чтобы обеспечить соблюдение некоторых ограничений на него.

ответ

2

Хотя правила соответствуют вашим требованиям, они теперь устарели в пользу простых старых ограничений проверки. Было бы неплохо использовать правила, если вы считаете, что база данных может быть перенесена в будущие версии SQL Server. См. «Важное» сообщение в верхней части документации MSDN: http://msdn.microsoft.com/en-us/library/ms188064.aspx.

Вы можете получить повторное использование, используя определенную пользователем функцию и вызвать ее во всех контрольных ограничениях, но вам все равно нужно явно определять ограничения проверки для всех столбцов, где она применяется.

CREATE FUNCTION IsDecimal(@input varchar(max)) 
RETURNS bit 
AS 
BEGIN 
    IF @value LIKE '^\-?\d+\.\d+$' 
     RETURN 1 
    ELSE 
     RETURN 0 
END 
GO 

ALTER TABLE dbo.tblAuditTrail  
    ADD CONSTRAINT CK_DecimalNumber  
    CHECK (dbo.IsDecimal(DecimalColumn) = 1)  
GO 
+0

Daniel, Большое спасибо за это. Кажется, жаль, что правила устарели, но это жизнь в ИТ, я думаю :-) Я возьму и адаптирую ваше предложение - огромное спасибо! – noonand

+0

Это будет работать, но производительность скалярных UDF ужасна. –

1

Ваше ограничение - это ограничение типа.

С SQL, вы можете справиться с этой ситуацией с помощью определяемых пользователем типов, где ваш «повторное» материализуется, объявив несколько столбцов быть такого типа,

или вы должны повторить ограничение типа в качестве проверки ограничение для каждого отдельного столбца.

+0

Я не думаю, что связать ограничение проверки с пользовательским типом. Конечно, можно использовать тип CLR, но это часто не вариант и, безусловно, влияет на производительность. –

+0

Erwin Я действительно не думаю, что все UDT делает переопределение уже существующего типа с более подходящим именем или длиной: sp_addtype birthday, datetime, 'NULL'; OR sp_addtype N'CustomerName ', nvarchar (20), а не null – noonand