Bạn có thể sử dụng các tham số có giá trị của bảng để xử lý điều này. Lớp ứng dụng sẽ trông giống như
C #
var tvp = new DataTable();
tvp.Columns.Add("Id", typeof(int));
foreach(var id in RecIdsToDelete)
tvp.Rows.Add(new {id});
var connection = new SqlConnection("your connection string");
var delete = new SqlCommand("your stored procedure name", connection)
{
CommandType = CommandType.StoredProcedure
};
delete
.Parameters
.AddWithValue("@ids", tvp)
.SqlDbType = SqlDbType.Structured;
delete.ExecuteNonQuery();
SQL
IF NOT EXISTS(SELECT * FROM sys.table_types WHERE name = 'IDList')
BEGIN
CREATE TYPE IDList AS TABLE(ID INTEGER)
END
CREATE PROCEDURE School.GroupStudentDelete
(
@IDS IDLIST READONLY
)
AS
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION
DECLARE @Results TABLE(id INTEGER)
DELETE
FROM TblName
WHERE Id IN (SELECT ID FROM @IDS)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE();
ROLLBACK TRANSACTION
THROW; -- Rethrow exception
END CATCH
GO
Có một số ưu điểm của phương pháp này so với việc xây dựng chuỗi
- Bạn tránh tạo các truy vấn trong lớp ứng dụng, tạo ra sự tách biệt các mối quan tâm
- Bạn có thể dễ dàng kiểm tra các kế hoạch thực thi và tối ưu hóa các truy vấn
- Bạn ít bị tấn công SQL injection hơn, vì cách tiếp cận nhất định của bạn sẽ không thể sử dụng truy vấn paramateed để xây dựng mệnh đề IN
- Mã dễ đọc và minh họa hơn
- Cuối cùng, bạn sẽ không tạo ra các chuỗi dài quá mức
Hiệu suất
Có một số cân nhắc về hiệu suất của TVP trên các tập dữ liệu lớn.
Vì TVP là các biến, chúng không biên dịch các số liệu thống kê. Điều này có nghĩa là trình tối ưu hóa truy vấn đôi khi có thể làm sai lệch kế hoạch thực thi. Nếu điều này xảy ra, có một số lựa chọn:
- đặt
OPTION (RECOMPILE)
trên bất kỳ tuyên bố nào của TVP khi lập chỉ mục là một vấn đề - ghi TVP vào một nhiệt độ cục bộ và thiết lập lập chỉ mục ở đó
Đây là một bài viết hay về TVP's với phần hay về cân nhắc hiệu suất và điều gì sẽ xảy ra khi nào.
Vì vậy, nếu bạn lo lắng về việc đạt đến giới hạn đối với các tham số chuỗi, thì các tham số có giá trị trong bảng có thể là cách tốt nhất. Nhưng cuối cùng, thật khó để nói nếu không biết thêm về tập dữ liệu bạn đang làm việc.