SQL参数化查询多个值而不修改数据库

时间:2017-05-10 18:12:38

标签: sql sql-server

我目前的解决方案是

SELECT * FROM TableName WHERE ID in (1, 2, 3)

这不能转换为

SELECT * FROM TableName WHERE ID in (@IDs)

与数据库的连接无法生成临时表或函数。有没有办法在不修改数据库的情况下在单个语句中执行具有多个值的参数化查询?

参数化查询的原因是并非每种情况都会搜索数字字段。因此,接收的值可以包含任何文本。有没有办法替换输入中的特殊字符,以便不存在返回用户无法访问的信息的风险?

编辑:更多信息

SELECT *
FROM [dbo].[Parts]
WHERE IsDeleted = 0
    AND [PartNumber] IN (@PartNumbers)
ORDER BY [PartNumber] ASC

在上面的SQL中,从文本文件中读取查询,并使用groovy将@PartNumbers替换为'PartNumber1', 'PartNumber2'

但是groovy脚本写的值是入站消息属性。所以在这种情况下,用户发出GET Rest请求/myservice?partnumbers=PartNumber1,PartNumber2这很容易注入,如果参数是partnumbers = PartNumber1'或'%那么结果将是

SELECT *
FROM [dbo].[Parts]
WHERE IsDeleted = 0
    AND [PartNumber] IN ('PartNumber1' or '%')
ORDER BY [PartNumber] ASC

这将返回太多信息。

2 个答案:

答案 0 :(得分:1)

参数是值占位符。如果要在查询中比较/使用多个值,则应使用多个参数。

示例:

this.player.loadModule("captions");

如果参数的数量可能过大,请考虑使用表值参数。以下是关于c#中前一个SO答案的链接,我会提供更多,但我不确定你写的是什么。Parameterize an SQL IN clause

答案 1 :(得分:0)

前段时间我有类似的情况,我以类似于@Igor提供的SO链接的方式解决了它。
我所做的是将单个分隔字符串中的所有值传递,但在后端我让SQL Server将分隔符分隔开该字符串并将不同的部分插入到临时表中。然后我以极其惊人的表现将临时表加入到有问题的表中。

如果您提供一些数据,我们可以告诉您如何完成。

祝你好运!