증상
제약 조건을 인수로 갖는 TVP (테이블 반환 매개 변수)를 사용 하는 다음과 같은 transact-sql 저장 프로시저가 있다고 가정 합니다.
create type TestTvpType as table
(
id int primary key, -- UNIQUE will also do the trick
data int
);
go
create procedure TestTvpProc @tvp TestTvpType readonly
as
begin
select * from @tvp;
end;
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));
// Populate the TVP so it will trigger a PRIMARY KEY VIOLATION error
myDataTable.Rows.Add(1, 1000);
myDataTable.Rows.Add(1, 2000);
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@tvp";
parameter.SqlDbType = System.Data.SqlDbType.Structured;
parameter.Value = myDataTable;
SqlCommand command = new SqlCommand("TestTvpProc", connection);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(parameter);
connection.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에 대 한 최신 누적 업데이트를 확인 하세요.
상태
Microsoft는 이 문제가 "적용 대상" 절에 나열된 Microsoft 제품에서 발생하는 문제로 확인했습니다.
참조
Microsoft에서 소프트웨어 업데이트를 설명 하는 데 사용 하는 용어 에 대해 알아봅니다.