我正在从我的C#代码中调用SQL Server存储过程:
using (SqlConnection conn = new SqlConnection(connstring)) { conn.Open(); using (SqlCommand cmd = new SqlCommand("InsertQuerySPROC", conn)) { cmd.CommandType = CommandType.StoredProcedure; var STableParameter = cmd.Parameters.AddWithValue("@QueryTable", QueryTable); var NDistanceParameter = cmd.Parameters.AddWithValue("@NDistanceThreshold", NDistanceThreshold); var RDistanceParameter = cmd.Parameters.AddWithValue(@"RDistanceThreshold", RDistanceThreshold); STableParameter .SqlDbType = SqlDbType.Structured; NDistanceParameter.SqlDbType = SqlDbType.Int; RDistanceParameter.SqlDbType = SqlDbType.Int; // Execute the query SqlDataReader QueryReader = cmd.ExecuteReader();
我的存储过程是相当标准的,但是可以与之连接QueryTable(因此需要使用存储过程)。
QueryTable
现在:我想将字符串列表添加List<string>到参数集。例如,我存储的proc查询如下所示:
List<string>
SELECT feature FROM table1 t1 INNER JOIN @QueryTable t2 ON t1.fid = t2.fid WHERE title IN <LIST_OF_STRINGS_GOES_HERE>
但是,字符串列表是动态的,并且有数百个长度。
有没有一种方法可以将字符串列表传递List<string>给存储的过程?还是有更好的方法来做到这一点?
非常感谢,布雷特
如果您使用的是SQL Server 2008,则有一个称为“用户定义的表类型”的新功能。这是一个如何使用它的示例:
创建您的用户定义表类型:
CREATE TYPE [dbo].[StringList] AS TABLE( [Item] [NVARCHAR](MAX) NULL );
接下来,您需要在存储过程中正确使用它:
CREATE PROCEDURE [dbo].[sp_UseStringList] @list StringList READONLY AS BEGIN -- Just return the items we passed in SELECT l.Item FROM @list l; END
最后是在C#中使用它的一些sql:
using (var con = new SqlConnection(connstring)) { con.Open(); using (SqlCommand cmd = new SqlCommand("exec sp_UseStringList @list", con)) { 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); using (var dr = cmd.ExecuteReader()) { while (dr.Read()) Console.WriteLine(dr["Item"].ToString()); } } } }
要从SSMS执行此操作
DECLARE @list AS StringList INSERT INTO @list VALUES ('Apple') INSERT INTO @list VALUES ('Banana') INSERT INTO @list VALUES ('Orange') -- Alternatively, you can populate @list with an INSERT-SELECT INSERT INTO @list SELECT Name FROM Fruits EXEC sp_UseStringList @list