从 C# 将列表传递到 SQL Server 存储过程
在给定的 C# 代码中,正在使用各种参数值调用存储过程,包括字符串列表。但是,存储过程中的查询要求将列表作为 IN 子句的一部分进行传递。
解决方案:使用用户定义的表类型 (SQL Server 2008)
SQL Server 2008 引入了用户定义的表类型,该功能允许以结构化方式将数据集合传递到存储过程。以下是实施此解决方案的方法:
1.创建用户定义的表类型
创建与字符串列表对应的表类型。例如:
CREATE TYPE [dbo].[StringList] AS TABLE( [Item] [NVARCHAR](MAX) NULL );
2。修改存储过程
调整存储过程以接受表类型作为输入参数:
CREATE PROCEDURE [dbo].[sp_UseStringList] @list StringList READONLY AS BEGIN -- Query using the table type SELECT l.Item FROM @list l; END
3.在 C# 中填充表类型
在 C# 中,创建一个 DataTable 对象并使用字符串列表填充它。然后,定义一个参数将 DataTable 传递给存储过程。
using (var table = new DataTable()) { table.Columns.Add("Item", typeof(string)); for (int i = 0; i < 10; i++) table.Rows.Add("Item " + i.ToString()); var pList = new SqlParameter("@list", SqlDbType.Structured); pList.TypeName = "dbo.StringList"; pList.Value = table; cmd.Parameters.Add(pList); }
4.执行存储过程
使用填充的 SqlParameter 对象执行存储过程。
示例用法:
using (var con = new SqlConnection(connstring)) { con.Open(); using (SqlCommand cmd = new SqlCommand("exec sp_UseStringList @list", con)) { using (var dr = cmd.ExecuteReader()) { while (dr.Read()) Console.WriteLine(dr["Item"].ToString()); } } }
以上是如何将 C# 字符串列表传递给 SQL Server 存储过程的 IN 子句?的详细内容。更多信息请关注PHP中文网其他相关文章!