Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

C # &SQL Server - cách tốt nhất để xóa nhiều Hàng trong một lần sử dụng thủ tục được lưu trữ

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng .Include () khi tham gia một dạng xem bằng Entity Framework

  2. Yêu cầu không thành công hoặc dịch vụ không phản hồi kịp thời?

  3. DATEPART () Ví dụ trong SQL Server

  4. Làm cách nào để tạo lập trình chèn vào tệp kịch bản dữ liệu từ bảng cơ sở dữ liệu?

  5. PI () Ví dụ trong SQL Server