C# 创建动态的、用户生成的查询,不限制SQL中的参数
我有一个asp.net页面,允许用户通过生成要包含在存储过程中的where子句来搜索数据库。问题在于,该程序必须考虑各种条件下的未知数量的参数。一个过于简化的示例可能如下所示:C# 创建动态的、用户生成的查询,不限制SQL中的参数,c#,sql,asp.net,sql-server,tsql,C#,Sql,Asp.net,Sql Server,Tsql,我有一个asp.net页面,允许用户通过生成要包含在存储过程中的where子句来搜索数据库。问题在于,该程序必须考虑各种条件下的未知数量的参数。一个过于简化的示例可能如下所示: SELECT [Column1] FROM [TableName] WHERE 1=1 --Everything below user generated AND ( ([Column2] = '1' AND [Column3] = '5' AND [Column4] = '9') OR ([Column2]
SELECT [Column1] FROM [TableName] WHERE 1=1
--Everything below user generated
AND
(
([Column2] = '1' AND [Column3] = '5' AND [Column4] = '9') OR
([Column2] = '2' AND [Column3] = '6' AND [Column4] = '8') OR
...
([Column2] = '25' AND [Column3] = '3' AND [Column4] = '1')
)
AND [Column5] BETWEEN '10' AND '200'
我想知道最好的解决办法是什么。我知道我可以将where子句构建为一个字符串,并将其作为一个大参数传递给存储过程,然后将lot作为动态sql执行,但有什么更好的解决方案呢?首先,存储过程是一个优化的/上下文化的执行计划
您想要的是对您操作的列、运算符没有限制(=,比如,看看LINQ怎么样?如果它真的是动态的,那么仅仅使用动态SQL而不使用存储过程不是更容易吗?@JamesZ查询的这部分是一个更大的预先存在的存储过程的一部分,它在其他几个地方被引用。将该过程执行到一个表中。从表中选择并添加where动态sql中的子句。您知道sql注入攻击是什么吗?如果您的“用户生成”部分确实是由用户提供的,并且未正确清理,则这是一个巨大的安全漏洞