Конфликт инструкции insert с ограничением check

Can any body give the suggestions.Why I am getting this error.

System.Data.SqlClient.SqlException: The INSERT statement conflicted with the CHECK constraint «CK_GL10000_TRXDATE__56701F76″. The conflict occurred in database «TWO», table «dbo.GL10000», column ‘TRXDATE’.

This is my stored procedure :

SqlCommand myCommand1 = new SqlCommand("taGLTransactionHeaderInsert", strcon);

  myCommand1.CommandType = CommandType.StoredProcedure;

  myCommand1.CommandText = "taGLTransactionHeaderInsert";

  myCommand1.Parameters.Add("@I_vBACHNUMB", SqlDbType.Char).Value = GLHdr.BACHNUMB;

  myCommand1.Parameters.Add("@I_vREFRENCE", SqlDbType.Char).Value = "ExcelImport";

  myCommand1.Parameters.Add("@I_vTRXDATE", SqlDbType.DateTime).Value = GLHdr.TRXDATE;

Table definition:

CREATE TABLE [dbo].[GL10000](

[PSTGSTUS] [smallint] NOT NULL,

[LASTUSER] [char](15) NOT NULL,

[LSTDTEDT] [datetime] NOT NULL,

[USWHPSTD] [char](15) NOT NULL,

[TRXTYPE] [smallint] NOT NULL

    /* More columns? not included in script that OP added */
)
GO

ALTER TABLE [dbo].[GL10000]  WITH CHECK ADD CHECK
  ((datepart(hour,[RVRSNGDT])=(0) AND datepart(minute,[RVRSNGDT])=(0)
  AND datepart(second,[RVRSNGDT])=(0) AND datepart(millisecond,[RVRSNGDT])=(0)))
GO

ALTER TABLE [dbo].[GL10000]  WITH CHECK ADD CHECK
  ((datepart(hour,[Tax_Date])=(0) AND datepart(minute,[Tax_Date])=(0)
  AND datepart(second,[Tax_Date])=(0) AND datepart(millisecond,[Tax_Date])=(0)))
GO

ALTER TABLE [dbo].[GL10000]  WITH CHECK ADD CHECK
  ((datepart(day,[TIME1])=(1) AND datepart(month,[TIME1])=(1)
  AND datepart(year,[TIME1])=(1900)))
GO

ALTER TABLE [dbo].[GL10000]  WITH CHECK ADD CHECK
  ((datepart(hour,[TRXDATE])=(0) AND datepart(minute,[TRXDATE])=(0)
  AND datepart(second,[TRXDATE])=(0) AND datepart(millisecond,[TRXDATE])=(0)))
GO

ALTER TABLE [dbo].[GL10000] ADD  CONSTRAINT
  [DF__GL10000__DEX_ROW__540C7B00]  DEFAULT (getutcdate()) FOR [DEX_ROW_TS]
GO

Время на прочтение
2 мин

Количество просмотров 26K

Кто-то задал такой вопрос:

Мне нужно создать таблицу group со столбцом code. Можно ли добавить ограничение на столбец, которое допускало бы только буквенные символы (D, M, O, P или T) с последующими двумя цифровыми символами?

Ему ответили:

Вы не можете этого сделать обычным способом — MS SQL Server поддерживает проверку ограничений, но лишь в виде мин/макс значения INT, длины строки и т.п. То, что вам нужно, — проверка на основе регулярного выражения, которую SQL Server не поддерживает. Теоретически можно сделать .NET вставку, развернуть на SQL Server и заставить его использовать такую проверку — нетривиальная задача.

Попробуем разобраться

Не смотря на то, что SQL server не поддерживает регулярные выражения в полной мере, но поставленную выше задачу можно без проблем решить и на T-SQL. Вот так будет выглядеть это регулярное выражение

[DMOPT][0-9][0-9]

Оно допускает только буквенные символы (D, M, O, P или T) с последующими двумя цифровыми символами. Ладно, хватит разговоров, давайте перейдем к коду

Создадим таблицу

CREATE TABLE blatest(code char(3))

Добавим проверку ограничения

ALTER TABLE blatest ADD  CONSTRAINT ck_bla 
CHECK (code like '[DMOPT][0-9][0-9]' )
GO

Теперь несколько инструкций для вставки данных


INSERT blatest VALUES('a12') --недопустимое значение
INSERT blatest VALUES('M12')  --допустимое значение
INSERT blatest VALUES('D12') --допустимое значение
INSERT blatest VALUES('DA1') --недопустимое значение

Как видите, мы дважды получили сообщение об ошибке
Сообщение 547, уровень 16, состояние 0, строка 1
Конфликт инструкции INSERT с ограничением CHECK "ck_bla". Конфликт произошел в базе данных "Test", таблица "dbo.blatest", столбец 'code'.
Выполнение данной инструкции было прервано.

Если вы хотите выполнить вставку D12, а не d12, т.е. нужна чувствительность к регистру, тогда нужно создать такое ограничение

(code like '[DMOPT][0-9][0-9]' COLLATE SQL_Latin1_General_CP1_CS_AS )

Все, что потребовалось изменить — добавить параметр сортировки SQL_Latin1_General_CP1_CS_AS.

Чтобы узнать, что дает этот параметр, выполните следующий запрос

SELECT * FROM ::fn_helpcollations()
WHERE name = 'SQL_Latin1_General_CP1_CS_AS'

Вот, что вернул запрос в описании

Latin1-General, case-sensitive, accent-sensitive, kanatype-
insensitive, width-insensitive for Unicode Data, SQL Server Sort Order 51 on Code Page 1252 for non-Unicode Data

Давайте создадим новое ограничение, но прежде нам нужно удалить старое


ALTER TABLE blatest DROP CONSTRAINt ck_bla
GO

Теперь создаем новое и проверяем


ALTER TABLE blatest ADD CONSTRAINT ck_bla 
CHECK (code LIKE '[DMOPT][0-9][0-9]' COLLATE SQL_Latin1_General_CP1_CS_AS )
GO

INSERT blatest VALUES('D12') --допустимое значение
INSERT blatest VALUES('d12') --недопустимое значение

Вставка значения D12 будет успешной, а d12 — нет.
Как видите, использовать регулярные выражения в ограничениях можно и никакой триггер в данном случае не нужен.

0 / 0 / 0

Регистрация: 15.12.2018

Сообщений: 2

1

15.12.2018, 16:09. Показов 7060. Ответов 6


Студворк — интернет-сервис помощи студентам

Наипростейшая табличка:

T-SQL
1
2
3
4
5
6
7
8
9
USE [Tour_agency ]
 
INSERT INTO Hotels (ID_Hotel_code, Name, City, Address, Hotel_Rating, Catering_services)
VALUES
(1,'Принцесса Вера', 'Алушта', 'Улица Воложкова 9б', '3 звезды', 'Включены завтраки и ужины'),
(2,'Роза Ветров', 'Сочи', 'Улица Пирожкова 40в', '4 звезды', 'Включены завтраки и ужины'),
(3,'Приморская', 'Сочи', 'Улица Соколова 1', '2 звезды', 'Включены завтраки'),
(4,'Анапа Лазурная', 'Анапа', 'Улица  Новороссийская 174', '2 звезды', 'Включены завтраки'),
(5,'Золотая бухта', 'Анапа', 'Кордонный переулок 1А', '4 звезды', 'Включены завтраки, обеды и ужины');

Объявлена с наипростейшими ограничениями:

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
USE [Tour_agency ]
GO
 
SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
CREATE TABLE [dbo].[Hotels](
    [ID_Hotel_code] [int] NOT NULL,
    [Name] [nvarchar](30) NOT NULL,
    [City] [nvarchar](20) NOT NULL,
    [Address] [char](27) NOT NULL,
    [Hotel_Rating] [nvarchar](8) NOT NULL,
    [Catering_services] [nvarchar](40) NULL,
PRIMARY KEY CLUSTERED 
(
    [ID_Hotel_code] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
 
ALTER TABLE [dbo].[Hotels]  WITH CHECK ADD CHECK  (([Address] like replicate('[a-яА-Я ]',len([Address]))))
GO
 
ALTER TABLE [dbo].[Hotels]  WITH CHECK ADD CHECK  (([Address] like replicate('[0-9]',len([Address]))))
GO
 
ALTER TABLE [dbo].[Hotels]  WITH CHECK ADD CHECK  (([Catering_services] like replicate('[a-яА-Я ]',len([Catering_services]))))
GO
 
ALTER TABLE [dbo].[Hotels]  WITH CHECK ADD CHECK  (([Catering_services] like replicate('[,]',len([Catering_services]))))
GO
 
ALTER TABLE [dbo].[Hotels]  WITH CHECK ADD CHECK  (([City] like replicate('[a-яА-Я ]',len([City]))))
GO
 
ALTER TABLE [dbo].[Hotels]  WITH CHECK ADD CHECK  (([Hotel_Rating] like replicate('[a-яА-Я ]',len([Hotel_Rating]))))
GO
 
ALTER TABLE [dbo].[Hotels]  WITH CHECK ADD CHECK  (([Hotel_Rating] like replicate('[0-9]',len([Hotel_Rating]))))
GO
 
ALTER TABLE [dbo].[Hotels]  WITH CHECK ADD CHECK  (([ID_Hotel_code]>(0) AND [ID_Hotel_code]<(10000)))
GO
 
ALTER TABLE [dbo].[Hotels]  WITH CHECK ADD CHECK  (([Name] like replicate('[a-яА-Я ]',len([Name]))))
GO

И выводит совершенно дикую ошибку, просто жизнь и голову себе сломал в поисках этой поганой мелочи всё портящей если такая вообще есть, может sql 2017 какой-то другой синтаксис имеет…

Сообщение 547, уровень 16, состояние 0, строка 3
Конфликт инструкции INSERT с ограничением CHECK «CK__Hotels__Catering__01D345B0». Конфликт произошел в базе данных «Tour_agency «, таблица «dbo.Hotels», column ‘Catering_services’.
Выполнение данной инструкции было прервано.



0



The INSERT statement conflicted with the CHECK constraint «ck_str_member_no«. The conflict occurred in database «C:DOCUMENTS AND SETTINGSKARTHIKEYANDESKTOPKOKDBINFT3009_ASS1_C3104855.MDF», table «dbo.Members», column ‘str_member_no‘.
The statement has been terminated.

I am using .MDF file in my visual studio 2008 Express. How do I solve it?

My insert Procedure :


ALTER PROCEDURE [dbo].[AddNewAGCMember] 
  -- Add the parameters for the stored procedure here
  @str_member_no varchar(6) = '', 
  @str_member_name varchar(50) = '',
  @str_member_password varchar(10) = '',    
  @str_addr_apartment_no varchar(10) = NULL,    
  @str_addr_building_name varchar(50) = NULL,   
  @str_addr_street_name varchar(50) = NULL, 
  @int_postal_code int = NULL,  
  @str_country_name varchar(50) = NULL, 
  @int_contact_no int = NULL,   
  @str_email_addr varchar(100) = '',    
  @date_registration date = ''  
AS
BEGIN
  -- SET NOCOUNT ON added to prevent extra result sets from
  -- interfering with SELECT statements.
  SET NOCOUNT ON;

  -- Insert statements for procedure here
  INSERT INTO Members 
    (str_member_no,
     str_member_name,
     str_member_password,
     str_addr_apartment_no,
     str_addr_building_name,
     str_addr_street_name,
     int_postal_code,
     str_country_name,
     int_contact_no,
     str_email_addr,
     date_registration) 
  VALUES
    (@str_member_no, 
     @str_member_name,
     @str_member_password,
     @str_addr_apartment_no,
     @str_addr_building_name,
     @str_addr_street_name,
     @int_postal_code,
     @str_country_name,
     @int_contact_no,
     @str_email_addr,
     @date_registration);
END

Table structure :

  • str_member_no, varchar(6), Unchecked
  • str_member_name, varchar(50), Unchecked
  • str_member_password, varchar(10), Unchecked
  • str_addr_apartment_no, varchar(10), Checked
  • str_addr_building_name, varchar(50), Checked
  • str_addr_street_name, varchar(50), Checked
  • int_postal_code, int, Checked
  • str_country_name, varchar(50), Checked
  • int_contact_no, int, Checked
  • str_email_addr, varchar(100), Unchecked
  • date_registration, date, Unchecked

    Unchecked
    

Оператор INSERT конфликтует с ограничением CHECK «ck_str_member_no«. Конфликт произошел в базе данных «C: ДОКУМЕНТЫ И НАСТРОЙКИ KARTHIKEYAN DESKTOP KOK DB INFT3009_ASS1_C3104855.MDF», таблица «dbo.Members», столбец ‘str_member_no‘. Заявление было прекращено.

Я использую файл .MDF в своей Visual Studio 2008 Express. Как мне это решить?

Моя процедура вставки:


ALTER PROCEDURE [dbo].[AddNewAGCMember] 
  -- Add the parameters for the stored procedure here
  @str_member_no varchar(6) = '', 
  @str_member_name varchar(50) = '',
  @str_member_password varchar(10) = '',    
  @str_addr_apartment_no varchar(10) = NULL,    
  @str_addr_building_name varchar(50) = NULL,   
  @str_addr_street_name varchar(50) = NULL, 
  @int_postal_code int = NULL,  
  @str_country_name varchar(50) = NULL, 
  @int_contact_no int = NULL,   
  @str_email_addr varchar(100) = '',    
  @date_registration date = ''  
AS
BEGIN
  -- SET NOCOUNT ON added to prevent extra result sets from
  -- interfering with SELECT statements.
  SET NOCOUNT ON;

  -- Insert statements for procedure here
  INSERT INTO Members 
    (str_member_no,
     str_member_name,
     str_member_password,
     str_addr_apartment_no,
     str_addr_building_name,
     str_addr_street_name,
     int_postal_code,
     str_country_name,
     int_contact_no,
     str_email_addr,
     date_registration) 
  VALUES
    (@str_member_no, 
     @str_member_name,
     @str_member_password,
     @str_addr_apartment_no,
     @str_addr_building_name,
     @str_addr_street_name,
     @int_postal_code,
     @str_country_name,
     @int_contact_no,
     @str_email_addr,
     @date_registration);
END

Структура таблицы:

  • str_member_no, varchar (6), не отмечен
  • str_member_name, varchar (50), не отмечено
  • str_member_password, varchar (10), не отмечено
  • str_addr_apartment_no, varchar (10), проверено
  • str_addr_building_name, varchar (50), Проверено
  • str_addr_street_name, varchar (50), проверено
  • int_postal_code, int, Проверено
  • str_country_name, varchar (50), проверено
  • int_contact_no, int, Проверено
  • str_email_addr, varchar (100), не отмечено
  • date_registration, дата, не отмечено

    Unchecked
    

Понравилась статья? Поделить с друзьями:
  • Завод полимерных труб руководство
  • Функции руководства в ооо
  • Таб аллохол инструкция по применению взрослым
  • Мультипекарь skybaker rmb m657 1s инструкция
  • Акушерство национальное руководство айламазян 2013