C#SQL Server-将列表传递到存储过程

我正在从我的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(因此需要使用存储过程)。

现在:我想将字符串列表添加List<string>到参数集。例如,我存储的proc查询如下所示:

SELECT feature 

FROM table1 t1

INNER JOIN @QueryTable t2 ON t1.fid = t2.fid

WHERE title IN <LIST_OF_STRINGS_GOES_HERE>

但是,字符串列表是动态的,并且有数百个长度。

还是有更好的方法来做到这一点?

非常感谢,布雷特

回答:

如果您使用的是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

以上是 C#SQL Server-将列表传递到存储过程 的全部内容, 来源链接: utcz.com/qa/419676.html

回到顶部