У меня есть таблица, в которой каждая строка представляет пару ключ-значение, содержащую параметры, относящиеся к конкретному приложению (например, количество дней для хранения предупреждений и т. Д.).Каждая из этих пар ключ-значение имеет различный диапазон допустимых значений, поэтому ни одно проверочное ограничение не будет одинаково применяться ко всем строкам.Некоторые строки могут вообще не нуждаться в проверке, а другие могут иметь строковые значения, требующие особого рассмотрения.Есть ли какой-нибудь способ, которым я могу создать проверочное ограничение для каждой строки и применить это ограничение при обновлении этой строки?
Я пытался добиться этого несколько раз, но каждый раз сталкивался с препятствиями.Каждая попытка основывается на существовании столбца [Проверка] в таблице, где для этой строки определено ограничение, аналогичное обычному основанному на таблице ограничению (например, «((CAST Value AS INTEGER) <= 60)»). </p>
Моей первой попыткой было создание обычного проверочного ограничения, которое вызывает определяемую пользователем функцию, которая считывает содержимое столбца [Проверка] (на основе значения идентификатора), выполняет проверку ограничения ивозвращает результат true / false в зависимости от того, нарушено ли ограничение.Проблема этого подхода заключается в том, что он требует написания динамического SQL для получения содержимого столбца [Check], а также выполнения кода, который он содержит.Но, конечно, динамический SQL не разрешен в функции.
Затем я попытался изменить функцию на хранимую процедуру, но не представляется возможным вызвать хранимую процедуру с помощью проверочного ограничения.
Наконец, я попытался создать функцию И хранимую процедуру и вызвать хранимую процедуру из функции, но это тоже недопустимо.
Единственный способ, которым я знаю, что это сработает, - это написатьогромное монолитное проверочное ограничение, содержащее проверки для каждой строки по значению идентичности, все OR объединены, например:
(ID = 1 AND (CAST Value AS INTEGER) <= 100) OR (ID =2 И значение IN («да», «нет»)) ИЛИ ... </p>
Но это кошмар, связанный с ошибками.Кто-нибудь знает способ выполнить то, что я хочу, не прибегая к монолитному проверочному ограничению?
По запросу рассмотрим следующее определение таблицы и несколько примеров строк:
CREATE TABLE [dbo].[GenericSetting]
(
[ID] [INT] IDENTITY(1,1) NOT NULL,
[Name] [NVARCHAR](50) NOT NULL,
[Value] [NVARCHAR](MAX) NULL,
[Check] [NVARCHAR](MAX) NULL,
CONSTRAINT [PK_GenericSetting] PRIMARY KEY CLUSTERED ([ID])
)
INSERT INTO [dbo].[GenericSetting] ([Name],[Value],[Check]) VALUES ('AlertRetentionDays', 60, 'CAST(Value AS INTEGER) <= 60');
INSERT INTO [dbo].[GenericSetting] ([Name],[Value],[Check]) VALUES ('ExampleMode', 60, 'CAST(Value AS INTEGER) IN (1,2,5)');