Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2011, 19:58   #1
brans
Форумчанин
 
Регистрация: 15.10.2010
Сообщений: 105
По умолчанию правила transact sql

Здравствуйте! Помогите исправить ошибку, пожалуйста!
create database test;
go
use test
create rule MyRule
as
@range = 12 and @value = '[0-9]';
go
create type My_type
from varchar(max) not null;
go

затем создаю и заполняю таблицы...
выходит ошибка: Сообщение 111, уровень 15, состояние 1, строка 6
CREATE RULE должна быть первой инструкцией в пакетном запросе.
Сообщение 1801, уровень 16, состояние 3, строка 2
База данных "test" уже существует. Выберите другое имя базы данных.
Сообщение 2715, уровень 16, состояние 7, строка 81
Столбец, параметр или переменная #3: невозможно найти тип данных MyRule.
brans вне форума Ответить с цитированием
Старый 01.12.2011, 22:09   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Цитата:
Важно!
Инструкция CREATE RULE будет удалена из будущей версии Microsoft SQL Server. Не следует использовать ее при создании новых приложений, и рекомендуется запланировать изменение тех приложений, в которых она используется. Вместо этой инструкции рекомендуется применять ограничения CHECK. Эти ограничения создаются при помощи ключевого слова CHECK инструкции CREATE TABLE или ALTER TABLE. Дополнительные сведения см. в разделе Ограничения CHECK.
Цитата взята из справочника Transact-SQL для SQL Server 2005.
Прик вне форума Ответить с цитированием
Старый 02.12.2011, 07:21   #3
brans
Форумчанин
 
Регистрация: 15.10.2010
Сообщений: 105
По умолчанию

Всёравно ошибка((
--Cоздание таблицы Organization_insp (Организация-приёмщик)
create table Org_insp (
Org_insp_ID int identity primary key,
Org_insp_NAME varchar(max),
Org_insp_INN varchar(max) check (Org_insp_INN = 12 and Org_insp_INN like '[0-9]'),
City_ID int references dbo.City ( City_ID));
insert into Org_insp
values ('ООО «Большая медведица»', '231234567898', '1');


Сообщение 547, уровень 16, состояние 0, строка 86
Конфликт инструкции INSERT с ограничением CHECK "CK__Org_insp__Org_in__173876EA ". Конфликт произошел в базе данных "test", таблица "dbo.Org_insp", column 'Org_insp_INN'.
Выполнение данной инструкции было прервано.
brans вне форума Ответить с цитированием
Старый 02.12.2011, 08:13   #4
brans
Форумчанин
 
Регистрация: 15.10.2010
Сообщений: 105
По умолчанию

Немного переделала


--Cоздание таблицы Organization_insp (Организация-приёмщик)
create table Org_insp (
Org_insp_ID int identity primary key,
Org_insp_NAME varchar(max) not null,
Org_insp_INN varchar(12) not null default 0,
check ((Org_insp_INN = 12) and (Org_insp_INN like '[0-9]')),
City_ID int references dbo.City ( City_ID));
insert into Org_insp
values ('ООО «Большая медведица»', '231234567898', '1');

теперь другая ошибка:
Сообщение 248, уровень 16, состояние 1, строка 87
Преобразование значения "231234567898" типа varchar привело к переполнению столбца типа int.
Выполнение данной инструкции было прервано.
brans вне форума Ответить с цитированием
Старый 02.12.2011, 09:06   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

проблема явно тут
Цитата:
check ((Org_insp_INN = 12) and
введённое вами число SQL сервер пытается преобразовать в целое, чтобы сравнить с 12-тью.
Вы явно хотели проверить длину. Но проверяете НЕ ДЛИНУ.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.12.2011, 11:39   #6
brans
Форумчанин
 
Регистрация: 15.10.2010
Сообщений: 105
По умолчанию

Serge_Bliznykov, а как тогда проверить длинну не могли бы подсказать?
brans вне форума Ответить с цитированием
Старый 02.12.2011, 11:51   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Создавайте как
Код:
Org_insp_INN char(12) check (Org_insp_INN like '[0-9]')
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.12.2011, 12:02   #8
brans
Форумчанин
 
Регистрация: 15.10.2010
Сообщений: 105
По умолчанию

Аватар, всё равно ошибка(
Говорит, что конфлик инструкции INSERT с ограничением CHECK "CK_Org_insp_Org_in_173876EA". Конфликт произошёл в базе данных "test" , таблица "dbo.Org_insp", column 'Org_insp_INN'
brans вне форума Ответить с цитированием
Старый 02.12.2011, 16:17   #9
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Ошибка будет, т.к. надо понимать что делает здесь LIKE.
В приведенном примере проверка на ввод цифр во всех 12-позициях должна быть такой:
Код:
check ((LEN(Org_insp_INN) = 12) and 
  (Org_insp_INN like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'))
Не больше, не меньше.

Никак не получается понять ТС. Почему он упорно пытается нагрузить сервер СУБД этой ерундой. Такие проверки делаются на клиенте.

Вот, например. Неверно ввели ИНН и далее прога отправляет его на сервер.
Сервер проверяет (по условиям CHECK) и возмущенно ругается. Наверняка разработчик в этом случае будет посылать исключение на клиента. А клиент, в свою очередь, будет пытаться понять что произошло и все равно займется проверкой введенного значения.
Так зачем же такие ректальные операции над гландами, когда можно спокойно, до отправки данных на сервер, проверить все ли гладко с данными и только затем отправлять их в БД?
Прик вне форума Ответить с цитированием
Старый 02.12.2011, 16:53   #10
brans
Форумчанин
 
Регистрация: 15.10.2010
Сообщений: 105
По умолчанию

Он всё равно мне ошибку выдаёт( я уже так написала:

--Cоздание таблицы Organization_insp (Организация-приёмщик)
create table Org_insp (
Org_insp_ID int identity primary key,
Org_insp_NAME varchar(max) not null,
Org_insp_INN bigint check (Org_insp_INN like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),
City_ID int references dbo.City ( City_ID));
insert into Org_insp
values ('ООО «Большая медведица»', '23', '1'),('ОАО «Практик»', '2312', '1'), ('ООО «Ученье-свет!»', '2312', '1');




Сообщение 547, уровень 16, состояние 0, строка 86
Конфликт инструкции INSERT с ограничением CHECK "CK__Org_insp__Org_in__182C9B23 ". Конфликт произошел в базе данных "test", таблица "dbo.Org_insp", column 'Org_insp_INN'.
Выполнение данной инструкции было прервано.

(строк обработано: 5)

(строк обработано: 8)

(строк обработано: 3)
Сообщение 547, уровень 16, состояние 0, строка 132
Конфликт инструкции INSERT с ограничением FOREIGN KEY "FK__Business___Org_i__2D27B809 ". Конфликт произошел в базе данных "test", таблица "dbo.Org_insp", column 'Org_insp_ID'.
Выполнение данной инструкции было прервано.


что с этим сделать???
brans вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на Transact-SQL REztor SQL, базы данных 3 15.04.2011 15:12
transact-sql Neymexa Помощь студентам 0 05.04.2010 10:12
transact-sql Neymexa Обсуждение статей 2 25.03.2010 14:53
Помогите, пожалуйста, с написанием задачи в Transact SQL Student'ochka SQL, базы данных 2 24.05.2009 17:21
Необходимо написать задачу в Transact SQL Student'ochka Помощь студентам 1 24.05.2009 14:05