我们都知道准备好的语句是防御 SQL 注入(inject)攻击的最佳方法之一。创建带有“IN”子句的准备好的语句的最佳方法是什么?有没有一种简单的方法可以使用未指定数量的值来执行此操作?以下面的查询为例。
SELECT ID,Column1,Column2 FROM MyTable WHERE ID IN (1,2,3)
目前,我正在对可能的值使用循环来构建一个字符串,例如。
SELECT ID,Column1,Column2 FROM MyTable WHERE ID IN (@IDVAL_1,@IDVAL_2,@IDVAL_3)
是否可以仅传递一个数组作为查询参数的值并按如下方式使用查询?
SELECT ID,Column1,Column2 FROM MyTable WHERE ID IN (@IDArray)
如果我在 VB.Net 中使用 SQL Server 2000 很重要
最佳答案
开始吧 - 首先创建以下函数...
Create Function [dbo].[SeparateValues]
(
@data VARCHAR(MAX),
@delimiter VARCHAR(10)
)
RETURNS @tbldata TABLE(col VARCHAR(10))
As
Begin
DECLARE @pos INT
DECLARE @prevpos INT
SET @pos = 1
SET @prevpos = 0
WHILE @pos > 0
BEGIN
SET @pos = CHARINDEX(@delimiter, @data, @prevpos+1)
if @pos > 0
INSERT INTO @tbldata(col) VALUES(LTRIM(RTRIM(SUBSTRING(@data, @prevpos+1, @pos-@prevpos-1))))
else
INSERT INTO @tbldata(col) VALUES(LTRIM(RTRIM(SUBSTRING(@data, @prevpos+1, len(@data)-@prevpos))))
SET @prevpos = @pos
End
RETURN
END
然后使用以下...
Declare @CommaSeparated varchar(50)
Set @CommaSeparated = '112,112,122'
SELECT ID,Column1,Column2 FROM MyTable WHERE ID IN (select col FROM [SeparateValues](@CommaSeparated, ','))
我认为 sql server 2008 将允许表函数。
更新
您将使用以下语法压缩一些额外的性能...
SELECT ID,Column1,Column2 FROM MyTable
Cross Apply [SeparateValues](@CommaSeparated, ',') s
Where MyTable.id = s.col
因为前面的语法导致 SQL Server 使用“IN”子句运行额外的“Sort”命令。另外 - 在我看来它看起来更好:D!
关于vb.net - 使用 SQL 参数处理 IN 子句中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/93100/