2015-02-03 5 views
0

Я написал функцию, которая возвращает int Тем не менее, я не могу использовать его в проверочном ограничении, эта ошибка выводится:SQL Server 2012: Вызов определенной функции пользователя в проверочном ограничении

«туРипсЫоп» не является признанным встроенным именем функции.

create table MyTable(
attr varchar(100) CHECK(myFunction(attr)=1) 
); 

Я также попытался

create table MyTable(
attr varchar(100) 
); 
alter table MyTable 
add constraint CheckAttr 
CHECK(myFunction(attr)=1); 

Я видел, как люди писали, что это не представляется возможным вызвать определенные пользователем функции в проверочном ограничении, но here написано можно:

CHECK Пользовательские функции, возвращающие скалярные значения, могут быть вызваны в ограничениях CHECK, если аргумент val ues переданы в столбцы справочных функций только в таблице или константах. Каждый раз, когда процессор запросов проверяет ограничение, процессор запросов вызывает функцию со значениями аргументов, связанными с проверкой текущей строки. Владелец таблицы также должен быть владельцем пользовательской функции, вызываемой ограничением CHECK в таблице.
+0

Вы должны использовать схему, как и NoDisplayName показал. Тем не менее, я также предостерег бы, что комбинация контрольного ограничения и UDF обычно делается для того, чтобы попытаться реализовать ограничения нескольких строк или нескольких таблиц и легко ошибиться для угловых случаев - если бы вы могли показать фактическую функцию и объяснить, что необходимо, у нас может быть лучшее общее предложение. –

+0

Ну, я знаю, что это вообще не очень хорошая идея, но меня попросили сделать это: функция проверяет достоверность электронной почты. –

ответ

4

Вы должны использовать schema name, когда вы звоните scalar function

create table MyTable(
attr varchar(100) CHECK(schema_name.myFunction(attr)=1) 
); 

Как отметил Damien_The_Unbeliever есть недостатки в использовании UDF в check constraint для получения дополнительной информации check here

+1

/facepalm Спасибо, теперь это работает) Мне нужно подождать еще несколько минут, прежде чем принимать ответ) –