vb.net – 使用SQL参数处理IN子句中的数据?

我们都知道,准备好的语句是SQL注入攻击的最佳方式之一.使用“IN”子句创建准备好的语句的最佳方法是什么?有没有一个简单的方法来做到这一点与未指定数量的价值观?以下列查询为例.
SELECT ID,Column1,Column2 FROM MyTable WHERE ID IN (1,2,3)

目前,我正在使用一个循环覆盖我可能的值来构建一个字符串,如.

SELECT ID,Column2 FROM MyTable WHERE ID IN (@IDVAL_1,@IDVAL_2,@IDVAL_3)

是否可以使用传递数组作为查询参数的值,并使用查询如下?

SELECT ID,Column2 FROM MyTable WHERE ID IN (@IDArray)

如果重要的是我正在使用SQL Server 2000,在VB.Net

在这里你先去创建以​​下功能…
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,len(@data)-@prevpos))))

        SET @prevpos = @pos 
    End

    RETURN

END

然后使用以下…

Declare @CommaSeparated varchar(50)
Set @CommaSeparated = '112,112,122'
SELECT ID,Column2 FROM MyTable WHERE ID IN (select col FROM [SeparateValues](@CommaSeparated,','))

我认为sql server 2008将允许表函数.

UPDATE

您将使用以下语法来挤压一些额外的性能…

SELECT ID,Column2 FROM MyTable
Cross Apply [SeparateValues](@CommaSeparated,') s
Where MyTable.id = s.col

因为以前的语法导致SQL Server使用“IN”子句运行额外的“Sort”命令.加上 – 在我看来,它看起来更好:D!

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...