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 | ||
|
Объявлена с наипростейшими ограничениями:
T-SQL | ||
|
И выводит совершенно дикую ошибку, просто жизнь и голову себе сломал в поисках этой поганой мелочи всё портящей если такая вообще есть, может 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), Uncheckedstr_member_name
, varchar(50), Uncheckedstr_member_password
, varchar(10), Uncheckedstr_addr_apartment_no
, varchar(10), Checkedstr_addr_building_name
, varchar(50), Checkedstr_addr_street_name
, varchar(50), Checkedint_postal_code
, int, Checkedstr_country_name
, varchar(50), Checkedint_contact_no
, int, Checkedstr_email_addr
, varchar(100), Unchecked-
date_registration
, date, UncheckedUnchecked
Оператор 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