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

标签 vb.net sql-server-2008 tsql sql-injection language-features

我们都知道准备好的语句是防御 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/

相关文章:

vb.net - 如何动态访问所有者表单的成员

c# - 如何在c#和vb.net中获取客户端机器的MAC地址

sql-server - 在 where 条件下使用 Sql server 列别名

sql - Select 语句以查找某些字段上的重复项

sql - 存储过程所有权链接

.net - 为数据表中的所有行设置值,无需 for 循环

c# - 在位图中查找 Blob

java - sql server 2008,PreparedStatement jdbc 获取多个查询

sql - CHECK 约束不起作用

java - 将值插入数据库时​​出现问题