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

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

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

Logo
MurCode

  • Форумы
  • Поиск
  • О проекте

ЕНЯ

Дата: 31.01.2016 14:05:04

есть таблица, при добавлении в нее данных хочу проверять на наличие существующих записей
делаю так:

ALTER TABLE dbo.Lead
WITH NOCHECK ADD CONSTRAINT Lead_CheckExistsLead CHECK NOT FOR REPLICATION ([dbo].[fn_CheckExistsLeads]([SiteId],[MobilePhone],[Email])=(0))
GO

и

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION dbo.fn_CheckExistsLeads(
    @SiteId uniqueidentifier,
    @MobilePhone varchar(255),
    @Email varchar(255))
  RETURNS int
  AS
BEGIN
  DECLARE @retval int
  if @SiteId is NULL
  begin
  select @retval = count(id)
    FROM [dbo].[Lead] 
    WHERE [SiteId] is null and
          [MobilePhone] = @MobilePhone and
          [Email] = @Email
   end
  else
  begin  select @retval = count(id)
    FROM [dbo].[Lead]
    WHERE [SiteId] = @SiteId and
          [MobilePhone] = @MobilePhone and
          [Email] = @Email
   end
  RETURN @retval
END

и при попытке insert получаю всегда ошибку: «Конфликт инструкции INSERT с ограничением CHECK «Lead_CheckExistsLead».»
что я делаю не так?

iap

Дата: 31.01.2016 14:40:58

ЕНЯ,

нужен просто CONSTRAINT UNIQUE.

ЕНЯ

Дата: 31.01.2016 16:13:08

iap,

а таким как у меня способом не будет работать?

ЕНЯ

Дата: 31.01.2016 16:20:33

и как быть если уже есть существующие, такие комбинации? которые надо оставить

invm

Дата: 31.01.2016 16:36:17

ЕНЯ
а таким как у меня способом не будет работать?

Упорно желаете заставить сервер заниматься мазохизмом?
К счастью для него, ничего у вас не выйдет — физически запись в таблицу вставляется раньше, чем проверяется ограничение.

invm

Дата: 31.01.2016 16:54:54

Невнимательно посмотрел.
Получится через функцию, только условие в check нужно изменить.
Но лучше так не делать, а завести, как уже советовали, unique constraint.

ЕНЯ

Дата: 31.01.2016 17:34:56

invm
Получится через функцию, только условие в check нужно изменить.

т.е.условие в check сделать =1 ?

invm
Но лучше так не делать, а завести, как уже советовали, unique constraint.

можно ли сделать unique constraint, чтоб остались старые данные которые не соответствуют этому правилу?

invm

Дата: 31.01.2016 18:11:58

ЕНЯ
т.е.условие в check сделать =1 ?

< 2

ЕНЯ
можно ли сделать unique constraint, чтоб остались старые данные которые не соответствуют этому правилу?

Если есть признак, отличающий старые данные от новых, то можно сделать фильтрованный уникальный индекс.
Или ограничение уникальности по требуемым столбцам + вычисляемый столбец на основе PK и этого признака.

ЕНЯ

Дата: 31.01.2016 18:38:49

invm,

а какой из предложенных вариантов, дешевле для базы?

alexeyvg

Дата: 31.01.2016 21:32:08

ЕНЯ
invm,

а какой из предложенных вариантов, дешевле для базы?

Чек-констрейн с функцией дороже и непредсказуемей, остальные варианты дешевле.

Ещё можно триггер сделать.

Оператор 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
    

Это тоже интересно:

  • Конфликт инструкции delete с ограничением reference sql
  • Конфликт инструкции alter table с ограничением foreign key как исправить
  • Конфидор экстра вдг инструкция по применению
  • Конфитюр из красной смородины на зиму пошаговая инструкция
  • Конфидор порошок инструкция по применению

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии