用于复杂过滤的SQL Prepared Statements

时间:2009-08-18 17:48:19

标签: sql sql-server

好的,所以我知道你应该使用预备语句来避免注入攻击以及巨大的速度提升,但仍然有一个地方我发现自己在进行字符串操作来构建我的sql查询。

假设我有一个由六个或七个或n个下拉列表组成的搜索功能。根据每个列表中是否有默认值,我想将一个项目附加到我的where子句。有没有一种很好的方法可以使用预处理语句来执行此操作,我可以将参数传递给存储过程并让它确定是否包含每个特定的where子句?

4 个答案:

答案 0 :(得分:2)

如果没有本文的链接,这样的问题就不会完整。它讨论了Exec和sp_executesql的使用,并在Dynamic SQL的上下文中深入讨论了SQL注入:

动态SQL的诅咒与祝福
http://www.sommarskog.se/dynamic_sql.html

答案 1 :(得分:0)

服务器应该优化where field like '%'之类的查询,所以我只准备一个包含所有内容的语句。这可能也会使您的代码更简单。

答案 2 :(得分:0)

您最好的选择是使用sp_ExecuteSQL参数化SQL ...类似于:

CREATE PROCEDURE usp_SampleTest
    @val1 INT
    @val2 INT
AS
    DECLARE @sql NVARCHAR(500)

    SET @sql = N'SELECT col1, col2, col3 FROM dbo.table WHERE 1 = 1'

    IF @val1 IS NOT NULL
       SET @sql = @sql + ' AND col3 = @pVal1'

    IF @val2 IS NOT NULL
       SET @sql = @sql + ' AND col4 = @pCol4'

    EXEC sp_ExecuteSQL @sql, '@pVal1 INT, @pVal2 INT', @val1, @val2
然后,SQL Server将以最大的灵活性在SQL中缓存执行计划的最小执行计划数。以这种方式使用sp_ExecuteSQL也意味着它对SQL注入攻击也是安全的。

答案 3 :(得分:0)

my answer查看问题SQL Stored Procedure: Conditional Return ...我认为你可以使用相同类型的东西。