2012-05-28 4 views
0

본문에서 제안 사항을 제공 할 수 있습니까?이 오류가 나타나는 이유는 무엇입니까?INSERT 문이 CHECK 제약 조건과 충돌했습니다.

System.Data.SqlClient.SqlException : INSERT 문이 CHECK 제약 조건 "CK_ GL10000 _TRXDATE__56701F76"과 충돌했습니다. 데이터베이스 "TWO", 테이블 "dbo.GL10000", 열 'TRXDATE'에서 충돌이 발생했습니다.

이 내 저장 프로 시저입니다 :

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; 

표 정의 : 테이블에 CHECK 제약 조건 및 저장 프로 시저에 전달하는 값이

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

고유 제약 조건? FK 제약? 게시 할 수 있습니까? –

+0

오류를 발생시키는 제약 조건을 찾는 방법을 알려주십시오. 오류 설명에서 제약 조건을 찾지 못했습니다. –

+0

SQL Mgmt Studio를 사용하여 테이블 GL10000을 선택하고 확장하십시오. 하지만 이름은 CK_GL10000_TRXDATE__56701F76 –

답변

1

중 하나를하지 않습니다 CHECK 제약 조건과 일치하거나 GL10000 테이블의 TRXDATE 열까지 확인하려고 시도한 값이 아닙니다. 가장 쉬운 방법은 SSMS를 사용하여이 테이블을 탐색하고 CHECK 제약 조건을 찾는 것입니다.

+0

GL10000 테이블에서 나는이 비용이 있습니다 : CK__GL10000__TRXDATE__56701F76. 내 문제를 어떻게 해결할 수 있는지 설명해 주시겠습니까 –

+0

@KiranReddy - 해당 제약 조건의 정의를보아야합니다. 실제로 유효한 SQL 표현식을 포함 할 수 있습니다. 내부에 무엇이 들어 있는지 모릅니다. –

1

저장 프로 시저 'taGLTransactionHeaderInsert'에서 삽입하기 전에 상단 근처에 다음 행을 추가하십시오.

set @I_vTRXDATE = convert(varchar, @I_vTRXDATE, 101) 

SQL 2008에서는 DATE 데이터 형식을 사용할 수도 있습니다.

create proc taGLTransactionHeaderInsert 
{ 
    @I_vTRXDATE DATE 
} 

날짜 등의 CAST

DECLARE @I_vTRXDATE2 DATE 
SET @I_vTRXDATE2 = CAST(@I_vTRXDATE as DATE) 

이 전달되고 어떤 날짜 시간 값의 시간 부분을 제거합니다. 그러나, 다음 오류에 대한 가능성이 잘못되는 날짜 + 시간에 통과하는 경우 요구 사항을 충족시키는 데 필요한 비즈니스 로직 규칙을 실행하는 저장 프로 시저로 전달되는 값을 수정해야합니다.

GLHdr.TRXDATE.Date; 

는 또한 SQL 2008에서 DATE 데이터 유형이 도입 된 점에 유의 즉

또한 값을자를 수는 전달된다. 당신은 그것에 대해 here 읽을 수 있습니다.

개인적으로 저는 제약 조건을 제거합니다. TRXDATE는 "거래일"을 의미하는 것처럼 들립니다. 일반적으로 트랜잭션이 발생한 정확한 날짜와 시간을 알고 싶습니다. 프레젠테이션 목적으로 DATE 만 표시되도록하려면 시간을 자르지 만 데이터는 완전히 손상되지 않습니다. (내 현재 버전 2012) SQL 서버 관리에서 :이 질문이 제기 된 이후

+0

이 값을 사용하여 동일한 저장 프로 시저로 작업했습니다. (GLHdr.TRXDATE 값 : "12-05-2007 12:15:15"). 오늘 나는 같은 가치를 사용하여 실행하려고합니다. 오늘은 오류가 발생하고 있습니다. 왜 이런 일이 일어 났는지 궁금합니다. –

+0

코드에서 변경된 것이있을 수도 있지만, 제공된 데이터가 제공된 제약 조건과 충돌한다는 것을 알고 있습니다. –

0

는 너무 CHECK 정확히 규칙 무엇인지 알아 내기 위해 이런 짓을, 내가 비슷한 오류가있어, 잠시왔다 다음 제약을 폴더,
잘 쉽게 을 찾을 수 있습니다이 제약 조건의 정의, 을 보여줍니다, 문제가 제약을 클릭하고 "수정"선택을 확장, 오류의 원인이되는 테이블을 클릭 정의에서 부분을 확인하십시오, 제 경우에는 제 칼럼인지 확인하고있었습니다. 코드에서 'E'문자를 삽입하려고 시도하는 동안 문자 만 'C'또는 'O'로 표시됩니다.

제약 정의 :

CHECK (([ColumnName]='C' OR [ColumnName]='O')) 

내 코드 : 체크 상태를 잘 작성하지 않은 경우이 체크 부분을 바탕으로

  switch (item.Type) 
      { 
      case myType.Elective: 
       entityName.ColumnName = "E"; 
       . 
       . 
       . 
      } 

, 당신은 가득 채우기에 체크 상태를 코드를 수정하거나, 수 그냥 수정하십시오.

관련 문제