按参数列表筛选SQL查询

Lia*_*ath 5 c# sql sql-server performance sql-server-2008

我有一个查询,我想返回与值列表关联的所有行.你可以这么简单地写成:

select * from TableA where ColumnB in (1, 2, 3, 5)
Run Code Online (Sandbox Code Playgroud)

我可以用C#生成这个查询并执行它.然而,这显然不太理想,因为它不使用参数,它会在尝试缓存查询计划时受到影响,并且显然容易受到SQL注入攻击.

另一种方法是将其写为:

select * from TableA where ColumnB = @value
Run Code Online (Sandbox Code Playgroud)

这可以通过C#执行多次,但这会导致N DB命中.

我能看到的另一个替代方案是创建一个临时表并以这种方式加入它,但是我没有看到这一点,因为它会更复杂并且受到与第一个选项相同的限制.

我正在使用SQL Server和OLDB,创建查询不是问题.我正在努力创造最有效的流程.

这三种方法中哪一种更有效?我错过了替代方案吗?

Aar*_*and 4

假设 SQL Server 2008 或更高版本,在 SQL Server 中创建一个表类型一次:

CREATE TYPE dbo.ColumnBValues AS TABLE
(
  ColumnB INT
);
Run Code Online (Sandbox Code Playgroud)

然后是一个采用这种类型作为输入的存储过程:

CREATE PROCEDURE dbo.whatever
  @ColumnBValues dbo.ColumnBValues READONLY
AS
BEGIN
  SET NOCOUNT ON;

  SELECT A.* FROM dbo.TableA AS A
    INNER JOIN @ColumnBValues AS c
    ON A.ColumnB = c.ColumnB;
END
GO
Run Code Online (Sandbox Code Playgroud)

现在,在 C# 中,创建一个 DataTable 并将其作为参数传递给存储过程:

CREATE TYPE dbo.ColumnBValues AS TABLE
(
  ColumnB INT
);
Run Code Online (Sandbox Code Playgroud)

(您可能想让该类型更加通用,我专门命名它是为了清楚地表明它在做什么。)