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,创建查询不是问题.我正在努力创造最有效的流程.
这三种方法中哪一种更有效?我错过了替代方案吗?
假设 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)
(您可能想让该类型更加通用,我专门命名它是为了清楚地表明它在做什么。)
| 归档时间: |
|
| 查看次数: |
3763 次 |
| 最近记录: |