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

Làm cách nào để chèn nhiều hàng trong SQL bằng các thủ tục được lưu trữ?

Trong SQL Server 2008+, có nhiều cách dễ dàng hơn để chèn nhiều hàng trong một câu lệnh. Ví dụ:cú pháp này hợp lệ:

INSERT dbo.table(col1, col2) VALUES
    (1, 2),
    (2, 3),
    (3, 4);

Ở trên sẽ chèn ba hàng. Trên các phiên bản cũ hơn, bạn có thể làm những việc dài dòng hơn một chút, chẳng hạn như:

INSERT dbo.table(col1, col2)
 SELECT 1, 2
  UNION ALL SELECT 2, 3
  UNION ALL SELECT 3, 4;

Tất nhiên ExecuteNonQuery của bạn không nhất thiết phải là một lệnh duy nhất, bạn có thể chuyển nó dưới dạng một chuỗi duy nhất và nó sẽ vẫn hoạt động:

INSERT dbo.table(col1, col2) VALUES(1, 2);
INSERT dbo.table(col1, col2) VALUES(2, 3);
INSERT dbo.table(col1, col2) VALUES(3, 4);

Nếu bạn muốn thực hiện việc này trong một thủ tục được lưu trữ, bạn có thể dễ dàng thực hiện tách trên các tham số nhiều giá trị, ví dụ:nếu bạn chuyển vào chuỗi sau:

1,2;2,3;3,4

Bạn có thể xử lý các giá trị đó bằng cách sử dụng một hàm như hàm mà tôi đã đăng ở đây:

Tách các cặp giá trị và tạo bảng sử dụng UDF

Vì vậy, thủ tục của bạn có thể giống như sau:

CREATE PROCEDURE dbo.AddOrderLineItems
    @LineItems VARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;

    INSERT dbo.OrderItems(Product, Quantity)
      SELECT Product, Quantity FROM dbo.MultiSplit(@LineItems);
END
GO

Và bạn sẽ gọi nó bằng cách sử dụng C # tương đương với:

EXEC dbo.AddOrderLineItems @LineItems = '1,2;2,3;3,4';

Hoặc bạn có thể sử dụng các tham số có giá trị bảng theo đề xuất của Alexey. Một ví dụ nhanh:

CREATE TYPE OrderLineItem AS TABLE
(
  Product INT,
  Quantity INT
);

Sau đó, bạn có thể tạo một thủ tục:

CREATE PROCEDURE dbo.AddOrderLineItems
    @LineItems OrderLineItem READONLY
    -- other parameters
AS
BEGIN
    SET NOCOUNT ON;

  INSERT dbo.OrderItems(Product, Quantity) 
  SELECT Product, Quantity FROM @LineItems;
END
GO

Sau đó, tạo TVP tương đương trong mã C # của bạn (Tôi không phải là người bạn muốn làm điều đó; bạn có thể thấy ví dụ ở đây ).

Tuy nhiên, có một số lưu ý, vui lòng xem câu hỏi này:

Tạo tổng quát nhập để sử dụng làm tham số giá trị bảng



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo một hàng riêng biệt nếu một cột chứa giá trị được phân tách bằng dấu phẩy

  2. java.lang.ClassNotFoundException:com.microsoft.jdbc.sqlserver.SQLServerDriver:Tôi có đang tải đúng trình điều khiển không?

  3. Cách thay đổi kiểu dữ liệu cột trong cơ sở dữ liệu SQL mà không làm mất dữ liệu

  4. Hàm IndexOf trong T-SQL

  5. Cách hiển thị hai chữ số sau dấu thập phân trong SQL Server