我的任务是构建一个查询(只是 where 子句)并将其存储在数据库中。然后它将由存储过程执行。
我想使用参数化动态查询,但是将查询与数据库中的参数分开存储、在 SQL 中读取并将参数与 where 子句联系起来很尴尬。尴尬在于参数的数量和类型是任意的。
我不想要未参数化的动态 SQL,因为搜索值是由用户提供的,而且我没有找到防止 SQL 注入的可靠方法。
有没有一种优雅的方法?
我正在使用 .NET 和 SQL Server。
我正在谈论的示例:
-- @filterId is passed to the SP
declare @sql nvarchar(max)
set @sql = 'select id, name, otherField from Items where' + whereClause
from Filters
where id = @filterId
create table #items {
id int not null,
name nvarchar(100),
otherField nvarchar(200)
}
insert into #items exec(@sql)
-- do something with items and return result
编辑:有人建议我避免使用主观术语以获得有意义的回应。我相信定义什么是“最佳”和“优雅”会做。因此,当我说“最佳”时,我正在寻找一种比其他解决方案更安全、快速、可读和可维护的解决方案。“优雅” - 用最少的代码完成任务,没有太多假设,例如,如果我需要处理任意参数集,我不想为可能的参数创建 20 个占位符或为所有可能的列创建一个表参数类型并通过合并获得正确的值。