증상
제약 조건이 인수인 TVP(테이블 반환 매개 변수)를 사용하는 다음과 같은 Transact-SQL 저장 프로시저가 있다고 가정합니다.
테이블로 TestTvpType 형식 만들기
(
id int 기본 키 -- UNIQUE도 요령을 수행합니다.
data int
);
GO
testTvpProc @tvp TestTvpType 읽기 전용 프로시저 만들기
방법
begin
에서 * 를 선택합니다.@tvp
끝;
GO
이 프로시저가 SQLCLR 저장 프로시저에서 호출되고 인수에 대한 제약 조건이 위반되는 시나리오에서는 "제약 조건 위반" 오류 메시지가 표시될 것으로 예상되는 경우 시스템 어설션을 잘못 받을 수 있습니다.
다음은 저장 프로시저에 대한 제약 조건 위반을 생성하는 SQLCLR 프로시저의 예입니다.
[SqlProcedure]
public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)
{
using (SqlConnection connection = new SqlConnection("context connection=true"))
{
sum = 0;
DataTable myDataTable = new DataTable("TestTvpType");
myDataTable.Columns.Add("id", typeof(Int32));
myDataTable.Columns.Add("data", typeof(Int32));
기본 키 위반 오류가 트리거되도록 TVP를 채웁니다.
myDataTable.Rows.Add(1, 1000);
myDataTable.Rows.Add(1, 2000);
SqlParameter 매개 변수 = 새 SqlParameter();
매개 변수. ParameterName = "@tvp";
매개 변수. SqlDbType = System.Data.SqlDbType.Structured;
매개 변수. 값 = myDataTable;
SqlCommand 명령 = 새 SqlCommand("TestTvpProc", connection);
명령. CommandType = CommandType.StoredProcedure;
명령. Parameters.Add(parameter);
연결. Open();
using(SqlDataReader reader = command. ExecuteReader())
{
while(reader. Read())
{
…;
}
}
}
}
해결 방법
이 문제는 SQL Server 대한 다음 누적 업데이트에서 해결되었습니다.
SQL Server 2016 RTM에 대한 누적 업데이트 5
SQL Server 2016 SP1의 누적 업데이트 2
SQL Server 2014 서비스 팩 2의 누적 업데이트 4
참고 이 업데이트로 인해 올바른 "제약 조건 위반" 오류 메시지가 반환됩니다.
SQL Server 대한 누적 업데이트 정보
SQL Server 대한 각각의 새로운 누적 업데이트에는 이전 누적 업데이트에 포함된 모든 핫픽스 및 보안 수정 사항이 포함됩니다. SQL Server 대한 최신 누적 업데이트를 확인하세요.
상태
Microsoft에서 이는 "적용 대상" 섹션에 나열된 Microsoft 제품에서의 문제임을 확인했습니다.
참조 자료
Microsoft에서 소프트웨어 업데이트를 설명하는 데 사용하는 용어 에 대해 알아봅니다.