Конфликт инструкции 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

0 / 0 / 0

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

Сообщений: 2

1

15.12.2018, 16:09. Показов 7477. Ответов 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



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

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

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

Мне нужно создать таблицу 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 — нет.
Как видите, использовать регулярные выражения в ограничениях можно и никакой триггер в данном случае не нужен.

The solution for above subject line exists in many links and have come across all links and find no solution for my issue.

here is my query :

 INSERT INTO PatientPatternElements (PatientPatternsID, ASEventID, LocationID, EffectiveDate, EffectiveDateEnd, WorkloadStartDate, WorkloadEndDate)
                SELECT DISTINCT PatientPatterns.ID, 
                        @hl7event_id, 
                        @default_locationid,
                        @hl7event_effective_date, 
                        @hl7event_effective_date, 
                        @hl7event_effective_date, 
                        @hl7event_effective_date 
                FROM PatientPatternElements
                INNER JOIN PatientPatterns
                    ON PatientPatternElements.PatientPatternsID = PatientPatterns.ID
                WHERE PatientPatterns.PatientEncounterID = @patient_encounter_id
                    AND PatientPatterns.Visit = @patient_encounter_visit

                ---------------------
                -- Error Checking
                ----------------------
                SET @SysError =  @@error
                IF @SysError != 0
                BEGIN
                    SET @iError = 23063
                    SET @strErrorMsg = 'Error Applying Manual Discharge Event, Error: ' + cast(@SysError AS varchar(256)) + ' encounter_id=' + cast(@patient_encounter_id as varchar(64))
                    GOTO ERROR 
                END

It is just a part of my code of my stored procedure.

WORKFLOW

It is happening in one of the version in client testing environment and client has one more version and the flow works without any issues.
when we are trying to run a record manually it is throwing an error in one of our log table and throws below message:

THREAD 4: ApplyPatientPatternEvents: Recovering from SQL exception: The INSERT statement conflicted with the CHECK constraint "CK_PatientPatternElements_Location". 
The conflict occurred in database "db_name", table "dbo.PatPatternElements".

and this

Rolling back Transaction. spHL7ApplyPatientPatternEvents: Error Applying Manual Discharge Event, Error: 547 encounter_id=20

as I said earlier it is happening in only one version, stored procedure is identical in both the versions, making hard to find out the issue.

there is nothing logged in Eventviewer and tracing sql profiler also not helping much since the SP spHL7ApplyPatientPatternEvents never show up in profiler.

Anyone can give an idea what exactly has happened ?

This is the query of constraint.

ALTER TABLE [dbo].[PatientPatternElements]  WITH CHECK ADD  CONSTRAINT [CK_PatientPatternElements_Location] CHECK  (([LocationID] IS NULL AND [LevelOfCareGroupID] IS NOT NULL OR [LocationID] IS NOT NULL AND [LevelOfCareGroupID] IS NULL))
GO

ALTER TABLE [dbo].[PatientPatternElements] CHECK CONSTRAINT     [CK_PatientPatternElements_Location]
GO

  • Remove From My Forums
  • Question

  • Please help i am new to asp.net and sql server 2005 and only when i try insert a new value into rating and press add review button is get this error at line 35  reviewAdder.ExecuteNonQuery(); and it says  The INSERT statement conflicted with the CHECK constraint «CK_ProductReview_Rating». The conflict occurred in database «AdventureWorks», table «Production.ProductReview», column ‘Rating’.
    The statement has been terminated.

    My code is this

    public class Reviews
    {
    public Reviews()
    {
    }
    public System.Collections.IEnumerable GetReviews(int ProductID)
    {
    System.Data.SqlClient.SqlDataAdapter reviewAdapter = new System.Data.SqlClient.SqlDataAdapter
    («SELECT ProductID, ReviewerName, EmailAddress, ReviewDate, Rating, Comments FROM Production.ProductReview WHERE ProductID=» + ProductID, ConfigurationManager.ConnectionStrings[«AdvWorks»].ConnectionString);
    DataSet dsReviews = new DataSet(«Reviews»);
    reviewAdapter.Fill(dsReviews, «ProductReview»);
    return ((dsReviews.Tables[«ProductReview»]) as System.ComponentModel.IListSource).GetList();

    }
    public void AddReview(string ProductID, string ReviewerName, string EmailAddress, string ReviewDate, string Rating, string Comments)
    {
    System.Data.SqlClient.SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings[«AdvWorks»].ConnectionString);
    sqlConn.Open();
    System.Data.SqlClient.SqlCommand reviewAdder = new System.Data.SqlClient.SqlCommand(
    «INSERT Production.ProductReview (ProductID, ReviewerName, EmailAddress, ReviewDate, Rating, Comments)»
    + » VALUES (‘» + ProductID + «‘,'» + ReviewerName + «‘,'» + EmailAddress + «‘,'» + DateTime.Now + «‘,'» + Rating + «‘,'» + Comments + «‘)», sqlConn);
    reviewAdder.ExecuteNonQuery();

    }
    }

    It is unable to do the insertion only that time the error is raised…Initaially page runs and i can enter values only when i update it shows error..Please help me

Answers

  • Based on the error you are receiving it would appear that the value(s) are outside of the specified range.  You might try using profiler to assure the values. 

    The below is t-sql for disregarding the check constraint and then to re-enable the constraint:

    CREATE TABLE temp(
    col1	INT CONSTRAINT  ck_val CHECK(col1 > 1)
    );
    GO
    
    INSERT temp
    VALUES(0);
    GO
    
    --ERROR occurs so alter table to ignore the constraint
    ALTER TABLE temp NOCHECK CONSTRAINT ck_val;
    GO
    
    --INSERT the same value and the value is allowed
    INSERT temp
    VALUES(0);
    GO
    
    --Re-enable the constraint
    ALTER TABLE temp CHECK CONSTRAINT ck_val;
    GO
    
    --Error occurs again
    INSERT temp
    VALUES(0);
    GO
    
    --Clean up
    DROP TABLE temp;
    GO
    
    

    Hope this helps


    David Dye

    • Marked as answer by

      Monday, April 5, 2010 3:42 AM

Понравилась статья? Поделить с друзьями:
  • Змз 409 евро 3 руководство по ремонту
  • Леводопа бенсеразид 250 инструкция по применению цена
  • Как определить тип руководства
  • Lh719 смарт часы инструкция на русском языке
  • Регистратор автомобильный wdr full hd 1080p инструкция