Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да вмъкна няколко реда в SQL с помощта на съхранени процедури?

В SQL Server 2008+ има по-лесни начини за вмъкване на няколко реда в един израз. Например този синтаксис е валиден:

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

Горното ще вмъкне три реда. В по-старите версии можете да правите малко по-подробни неща като:

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

Разбира се вашият ExecuteNonQuery не трябва да е една команда, можете да подадете това като единичен низ и пак ще работи:

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

Ако искате да направите това в съхранена процедура, можете лесно да извършите разделяне на параметри с множество стойности, например ако подадете следния низ:

1,2;2,3;3,4

Можете да обработите тези стойности с помощта на функция като тази, която публикувах тук:

Разделяне на двойки стойности и създаване на таблица използвайки UDF

Така че вашата процедура може да изглежда така:

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

И бихте го извикали, като използвате C# еквивалента на:

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

Или можете да използвате параметри със стойност на таблица, както е предложено от Алексей. Бърз пример:

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

След това можете да създадете процедура:

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

След това създайте еквивалентния TVP във вашия 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. Използване на PATINDEX за намиране на модели с различна дължина в T-SQL

  2. Копиране на резултати от заявка на SQL Server в таблица на Access 2010

  3. Изпълнете математически израз и задайте стойността на променлива в SQL

  4. Производителност на SQL сървър TOP CPU заявка -1

  5. SQL Server:Течове на ниво на изолация в обединените връзки