首页 >数据库 >mysql教程 >如何使用表值参数 (TVP) 高效地将数组传递给存储过程?

如何使用表值参数 (TVP) 高效地将数组传递给存储过程?

Linda Hamilton
Linda Hamilton原创
2025-01-10 17:23:43826浏览

Efficiently Passing Arrays to Stored Procedures Using Table-Valued Parameters (TVPs)

使用表值参数 (TVP) 将数组传递给存储过程

数据库应用程序经常需要将数组或值列表传递给存储过程。 对于 SQL Server 2008 及更高版本,表值参数 (TVP) 提供最有效的解决方案。

使用 TVP 创建存储过程

这涉及到首先定义 TVP 类型,然后创建存储过程:

<code class="language-sql">CREATE TYPE T1Ids AS Table (
    t1Id INT
);

CREATE PROCEDURE dbo.FindMatchingRowsInTable1 (@Table1Ids AS T1Ids READONLY)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT Table1.t1Id 
    FROM dbo.Table1 AS Table1
    JOIN @Table1Ids AS paramTable1Ids ON Table1.t1Id = paramTable1Ids.t1Id;
END</code>

调用存储过程

在您的应用程序中(使用 C# 的示例),将数据准备为 DataTable,建立数据库连接,并创建命令对象:

<code class="language-csharp">DataTable t1Ids = new DataTable();
t1Ids.Columns.Add("t1Id", typeof(int));

int[] listOfIdsToFind = new[] { 1, 5, 9 };
foreach (int id in listOfIdsToFind)
{
    t1Ids.Rows.Add(id);
}

SqlConnection testbedConnection = new SqlConnection(
    @"Data Source=.\SQLExpress;Initial Catalog=TestbedDb;Persist Security Info=True;User ID=testbedUser;Password=letmein12;Connect Timeout=5");

SqlCommand findMatchingRowsInTable1 = new SqlCommand("dbo.FindMatchingRowsInTable1", testbedConnection);
findMatchingRowsInTable1.CommandType = CommandType.StoredProcedure;

SqlParameter sqlParameter = new SqlParameter("Table1Ids", t1Ids);
findMatchingRowsInTable1.Parameters.Add(sqlParameter);</code>

最后执行存储过程并处理结果:

<code class="language-csharp">SqlDataReader sqlDataReader = findMatchingRowsInTable1.ExecuteReader();

while (sqlDataReader.Read())
{
    Console.WriteLine("Matching t1ID: {0}", sqlDataReader["t1Id"]);
}</code>

TVP 提供了一种类型安全且高效的方法,用于将数组或列表传递给存储过程,从而提高数据库应用程序的性能和可维护性。

以上是如何使用表值参数 (TVP) 高效地将数组传递给存储过程?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn