Applies ToSQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2016 Service Pack 1

증상

제약 조건을 인수로 갖는 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에 대 한 최신 누적 업데이트를 확인 하세요.

SQL Server 2016의 최신 누적 업데이트

SQL Server 2014의 최신 누적 업데이트

상태

Microsoft는 이 문제가 "적용 대상" 절에 나열된 Microsoft 제품에서 발생하는 문제로 확인했습니다.

 

참조

Microsoft에서 소프트웨어 업데이트를 설명 하는 데 사용 하는 용어 에 대해 알아봅니다.

도움이 더 필요하세요?

더 많은 옵션을 원하세요?

구독 혜택을 살펴보고, 교육 과정을 찾아보고, 디바이스를 보호하는 방법 등을 알아봅니다.

커뮤니티를 통해 질문하고 답변하고, 피드백을 제공하고, 풍부한 지식을 갖춘 전문가의 의견을 들을 수 있습니다.