在 TSQL 中,我可以写:
Select * from mytablename M where M.field in (1, 5, 8, 56)
如果我想在参数化 c# 中做同样的事情,语法是什么?
在 TSQL 中,我可以写:
Select * from mytablename M where M.field in (1, 5, 8, 56)
如果我想在参数化 c# 中做同样的事情,语法是什么?
SQL Server 2008 有一个称为表值参数的功能。您在 SQL Server 中创建一个“特殊类型”,然后您可以将 aDataTable
作为参数传递,其中包含您想要的所有值。
你可以这样使用它:
在数据库上这样做:CREATE TYPE dbo.IntArray AS TABLE (Value INT NOT NULL)
您的 IN 查询必须更改为:CustomerID IN (SELECT Value FROM @1)
// Your array of IDs
int[] ids = new[] { 1, 2, 3, 4, 5, 6, 7, 10 };
using (var connection = new SqlConnection("Initial Catalog=AdventureWorksLT2012;Integrated Security=True"))
{
connection.Open();
using (var command = new SqlCommand("SELECT CustomerID FROM SalesLT.Customer WHERE CustomerID IN (SELECT Value FROM @1)", connection))
{
// An untyped Datatable
var dt = new DataTable();
// With a single column
dt.Columns.Add();
// Copy your IDs in the DataTable
foreach (var v in ids)
{
dt.Rows.Add(v);
}
// Create the Table-Valued Parameter
var param = command.Parameters.AddWithValue("@1", dt);
param.SqlDbType = SqlDbType.Structured;
param.TypeName = "dbo.IntArray";
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
int id = (int)reader[0];
Console.WriteLine(id);
}
}
}
}
从技术上讲,您甚至可以更改查询,例如
INNER JOIN @1 Par ON CustomerID = Par.Value
这样做的好处是您可以创建一个多列DataTable
和表值参数并同时搜索多个条件。
(请注意,我的代码过长,因为它是基于 Microsoft 的 AdventureWorks db 的工作示例)