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

时间:2012-02-22 20:18:50

标签: asp.net sql stored-procedures

我有以下列表

ID | DESC | PRICE 
10 | SHOE | 5000
11 | LACE | 3000
12 | GAME | 2000
13 | TOAD | 3000

我现在正在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));
        ...
     }
}

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

3 个答案:

答案 0 :(得分: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

现在在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();
}

答案 1 :(得分:0)

您可以在SQL Server中声明自定义表数据类型,将其用作存储过程的参数,在代码中使用DataTable,并用行填充它。

详细了解MSDN: Table-Valued Parameters

答案 2 :(得分:0)

您可以查看使用Table-Valued Parameters将一次调用中的所有行作为单个参数传递:

  

表值参数提供了一种编组多行的简便方法   从客户端应用程序到SQL Server的数据不需要   多次往返或特殊服务器端逻辑处理   数据。您可以使用表值参数来封装数据行   在客户端应用程序中,将数据发送到服务器中   参数化命令。传入的数据行存储在表中   然后可以使用Transact-SQL操作变量。