我需要发送一些列表(约20000的ID)存储过程,就像这样:如何发送一个大阵列的存储过程
1391924, 6546510, 7419635, 6599910, 6546888, 1116510, 6546720, ...
我有一个List<int>
如何将此列表发送到存储过程?
然后我需要插入的ID列表上的临时表
我需要发送一些列表(约20000的ID)存储过程,就像这样:如何发送一个大阵列的存储过程
1391924, 6546510, 7419635, 6599910, 6546888, 1116510, 6546720, ...
我有一个List<int>
如何将此列表发送到存储过程?
然后我需要插入的ID列表上的临时表
您可以使用:Table-Valued Parameters
表值参数在SQL Server中一个新的参数类型2008表值参数是使用用户定义的表类型来声明。您可以使用表值参数将多行数据发送到Transact-SQL语句或例程(如存储过程或函数),而无需创建临时表或多个参数。
表值参数就像OLE DB和ODBC中的参数数组,但提供了更大的灵活性并与Transact-SQL更紧密地集成。表值参数也有能力参与基于集合的操作。
例如:
SQL服务器:
创建表值参数:
CREATE TYPE IDsTableType AS TABLE
(
[Product] [varchar](10) NOT NULL
)
它传递到存储过程:
CREATE PROCEDURE GetIDs
(
@TableVariable IDsTableType READONLY
)
AS
BEGIN
//Do Something
END
GO
C#代码传递表值p arameter存储过程:
DataTable dataTable = GetData();
// Configure the SqlCommand and SqlParameter.
SqlCommand cmd= new SqlCommand(
"GetIDs", connection);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter tvpParam = cmd.Parameters.AddWithValue(
"@TableVariable", dataTable);
tvpParam.SqlDbType = SqlDbType.Structured;
参见:Passing table-valued parameter data to a stored procedure
如果你写的数组转换成一个DataTable,你可以bulk insert数据表到数据库中。然后存储的proc可以从该表中读取。
可以不用一个数据表,甚至批量插入。我经常从对象中直接批量插入。所有你需要的是一个IDataReader实现的对象 - 泛型感谢你不难。 – TomTom
@TomTom好点! –