我可以将列表传递给存储过程吗?

MrM*_*MrM 2 sql asp.net stored-procedures

我有以下清单

ID | DESC | PRICE 
10 | SHOE | 5000
11 | LACE | 3000
12 | GAME | 2000
13 | TOAD | 3000
Run Code Online (Sandbox Code Playgroud)

我现在正在foreach循环中传递单个行,并且始终建立新连接,这看起来非常规,但我希望有更快的方法.

这是我的代码.

foreach(var item in tempList)
{
     using (connection)
     {
        SqlCommand command = new SqlComman("StoredProc", connection);
        command.Parameters.Add(new SqlParameter("id", item.id));
        command.Parameters.Add(new SqlParameter("desc", item.desc));
        command.Parameters.Add(new SqlParameter("price", item.price));
        ...
     }
}
Run Code Online (Sandbox Code Playgroud)

那么如何将列表传递给存储过程呢?

Aar*_*and 7

提供一个TVP的实际例子,除了链接(绝对值得一读).假设SQL Server 2008或更高版本.

首先,在SQL Server中:

CREATE TYPE dbo.Items AS TABLE
(
  ID          INT,
  Description VARCHAR(32),
  Price       INT
);
GO

CREATE PROCEDURE dbo.StoredProcedure
  @Items AS dbo.Items READONLY
AS
BEGIN
  SET NOCOUNT ON;

  INSERT INTO dbo.DestinationTable(ID, [DESC], Price)
    SELECT ID, Description, Price FROM @Items;
END
GO
Run Code Online (Sandbox Code Playgroud)

现在在C#中:

DataTable tvp = new DataTable();
tvp.Columns.Add(new DataColumn("ID"));
tvp.Columns.Add(new DataColumn("Description"));
tvp.Columns.Add(new DataColumn("Price"));

foreach(var item in tempList)
{ 
    tvp.Rows.Add(item.id, item.desc, item.price); 
}

using (connection)
{
    SqlCommand cmd = new SqlCommand("StoredProcedure", connection);
    cmd.CommandType = CommandType.StoredProcedure;
    SqlParameter tvparam = cmd.Parameters.AddWithValue("@Items", tvp);
    tvparam.SqlDbType = SqlDbType.Structured;
    connection.Open();
    cmd.ExecuteNonQuery();
}
Run Code Online (Sandbox Code Playgroud)