且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何插入使用存储过程在SQL中多行?

更新时间:2022-11-25 15:43:54

在SQL Server的2008+也有更简单的方法在一个单独的语句来插入多行。例如这个语法是有效的:

In SQL Server 2008+ there are easier ways to insert multiple rows in a single statement. For example this syntax is valid:

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



以上将插入三行。在旧版本,你可以做稍微详细的东西,如:

The above will insert three rows. On older versions you can do slightly more verbose things such as:

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



当然你的的ExecuteNonQuery 不必是一个命令,你可以通过这个作为一个字符串,它仍然可以工作:

Of course your ExecuteNonQuery does not have to be a single command, you can pass this as a single string and it will still work:

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

如果你想这样做在存储过程中,您可以轻松地在多值进行拆分参数,例如,如果你在下面的字符串传递:

If you want to do this in a stored procedure, you can easily perform a split on multi-valued parameters, for example if you pass in the following string:

1,2;2,3;3,4

您可以处理使用像我这里张贴一个函数的值:

You could process those values using a function like the one I posted here:

分割值对和创建表的使用UDF

所以你的过程可能是这样的:

So your procedure might look like this:

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#相当于调用它:

And you would call it using the C# equivalent of:

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

或阿列克谢的建议你可以使用表值参数。一个简单的例子:

Or you could use table-valued parameters as suggested by Alexey. A quick example:

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



然后,你可以创建一个过程:

Then you can create a procedure:

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



然后在你的C#代码创建了相当于TVP(我又不是你想这样做的家伙,你可以在这里看到一个例子。一>)

但也有一些注意事项,请看看这个问题:

However there are some caveats, please look at this question:

Creating广义类型用作表值参数