一般的问题如下:有一个标识符列表
List<int> Id = new List<int>() {1,2,3,4,5}
我有一个 SQL 查询
SELECT * FROM table
WHERE table.Id in(1,2,3,4,5)
↑↑↑↑↑↑↑↑↑
您需要将此列表作为存储过程参数传递。
当然,也有极端的选择,比如把一个列表变成一个字符串变量,列出用逗号分隔的元素……
DECLARE @Id nvarchar(50) = '1,2,3,4,5'
EXEC('SELECT * FROM table
WHERE table.Id in('+@Id+')')
值得这么麻烦吗?
如果您需要将列表传递给存储过程,这可以使用 xml 来完成,尽管在我看来最佳的是使用用户定义的表类型。为此,在 MSSQL 中创建了一个表类型(它可以包含一个或多个列):
让我们创建一个过程:
从 C# 调用存储过程时,DataTable 作为参数传递:
同样,您可以将结构更复杂的表传输到存储过程。