Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana cara menyisipkan beberapa baris dalam SQL menggunakan prosedur tersimpan?

Di SQL Server 2008+ ada cara yang lebih mudah untuk menyisipkan beberapa baris dalam satu pernyataan. Misalnya sintaks ini valid:

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

Di atas akan menyisipkan tiga baris. Pada versi yang lebih lama, Anda dapat melakukan hal-hal yang sedikit lebih bertele-tele seperti:

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

Tentu saja ExecuteNonQuery . Anda tidak harus menjadi satu perintah, Anda dapat meneruskan ini sebagai satu string dan itu akan tetap berfungsi:

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

Jika Anda ingin melakukan ini dalam prosedur tersimpan, Anda dapat dengan mudah melakukan pemisahan pada parameter multi-nilai, misalnya jika Anda memasukkan string berikut:

1,2;2,3;3,4

Anda dapat memproses nilai-nilai tersebut menggunakan fungsi seperti yang saya posting di sini:

Membagi pasangan nilai dan membuat tabel menggunakan UDF

Jadi prosedur Anda mungkin terlihat seperti ini:

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

Dan Anda akan menyebutnya menggunakan C# yang setara dengan:

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

Atau Anda bisa menggunakan parameter bernilai tabel seperti yang disarankan oleh Alexey. Contoh singkat:

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

Kemudian Anda dapat membuat prosedur:

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

Kemudian buat TVP yang setara dalam kode C# Anda (saya bukan orang yang Anda inginkan; Anda dapat melihat contoh di sini ).

Namun ada beberapa peringatan, silakan lihat pertanyaan ini:

Membuat generalized ketik untuk digunakan sebagai parameter nilai tabel



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Temukan kecocokan tepat menggunakan pencarian teks lengkap

  2. SQL Server SMO mengeluhkan DLL yang hilang

  3. SQL Server 2017 Langkah demi Langkah Instalasi -2

  4. SQL Server 2008 CTE Rekursi

  5. Mengapa tempdb saya mengatur ulang izin ketika server di-boot ulang?