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