【问题标题】:Can I pass a list to stored procedure?我可以将列表传递给存储过程吗?
【发布时间】:2012-02-22 20:18:50
【问题描述】:

我有以下列表

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));
        ...
     }
}

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

【问题讨论】:

  • 当您询问有关 SQL Server 的问题时,能否指定您使用的 SQL Server 版本? (您之前的问题需要很长时间才能确定您至少使用的是 SQL Server 2008。)

标签: asp.net sql stored-procedures


【解决方案1】:

除了链接(绝对值得一读)之外,举一个 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();
}

【讨论】:

  • 天哪!你的意思是我可以将整个DataTable 作为SqlParameter 传递?
  • @jp2code 是的,假设您使用的是 SQL Server 2008 或更高版本,并且能够在源数据库中创建表类型。
【解决方案2】:

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

阅读更多MSDN: Table-Valued Parameters

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 2014-09-26
      • 1970-01-01
      • 2014-06-11
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多