使用表值参数 (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中文网其他相关文章!