KB4010162 - PERBAIKAN: Sistem menegaskan terjadi ketika prosedur Transact-SQL yang disimpan dengan argumen TVP disebut dari prosedur SQLCLR

Berlaku Untuk
SQL 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

Gejala

Misalnya Anda memiliki prosedur Transact-SQL yang disimpan seperti berikut ini yang mengambil parameter bernilai tabel (TVP) yang memiliki batasan sebagai argumen:

buat tipe TestTvpType sebagai tabel

(

id kunci primer int, -- UNIQUE juga akan melakukan trik

int data

);

Pergi

buat prosedur TestTvpProc @tvp TestTvpType baca-baca

Sebagai

Mulai

pilih * dari @tvp;

Akhir;

Pergi

Dalam skenario di mana prosedur ini disebut dari prosedur tersimpan SQLCLR dan batasan dilanggar untuk argumen, Anda mungkin salah menerima penegasan sistem, ketika Anda berharap untuk menerima pesan kesalahan "batasan pelanggaran".

      

Berikut ini adalah contoh prosedur SQLCLR yang menghasilkan pelanggaran batasan untuk prosedur yang disimpan:

      

[SqlProcedure]

public static void ClrProcCallingTsqlProcWithTvpArgument(out int sum)

{

menggunakan (koneksi SqlConnection = SqlConnection baru("context connection=true"))

{

sum = 0;

DataTable myDataTable = new DataTable("TestTvpType");

myDataTable.Columns.Add("id", typeof(Int32));

myDataTable.Columns.Add("data", typeof(Int32));

Mengisi TVP sehingga akan memicu kesalahan PELANGGARAN KUNCI PRIMER

myDataTable.Rows.Add(1, 1000);

myDataTable.Rows.Add(1, 2000);

SqlParameter parameter = new SqlParameter();

parameter. ParameterName = "@tvp";

parameter. SqlDbType = System.Data.SqlDbType.Structured;

parameter. Nilai = myDataTable;

Perintah SqlCommand = SqlCommand baru("TestTvpProc", koneksi);

Perintah. CommandType = CommandType.StoredProcedure;

Perintah. Parameters.Add(parameter);

Koneksi. Buka();

menggunakan (SqlDataReader reader = perintah. ExecuteReader())

{

sementara (pembaca. Baca())

{

…;

}

}

}

}

Resolusi

Masalah ini telah diperbaiki dalam pembaruan kumulatif berikut untuk SQL Server:

Pembaruan Kumulatif 5 untuk SQL Server RTM 2016

Pembaruan Kumulatif 2 untuk SQL Server 2016 SP1

Pembaruan Kumulatif 4 untuk SQL Server 2014 Paket Layanan 2

Catatan Pembaruan ini menyebabkan pengembalian pesan kesalahan "batasan pelanggaran" yang benar.

Tentang pembaruan kumulatif untuk SQL Server

Setiap pembaruan kumulatif baru untuk SQL Server berisi semua perbaikan keamanan dan hotfix yang disertakan dalam pembaruan kumulatif sebelumnya. Lihat pembaruan kumulatif terbaru untuk SQL Server:

Pembaruan kumulatif terbaru untuk SQL Server 2016

Pembaruan kumulatif terbaru untuk SQL Server 2014

Status

Microsoft telah mengonfirmasi bahwa ini adalah masalah dalam produk Microsoft sebagaimana tercantum di bagian "Berlaku untuk".

Referensi

Pelajari tentang terminologi yang digunakan Microsoft untuk menjelaskan pembaruan perangkat lunak.