加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-17 00:27:33 所属栏目:大数据 来源:网络整理
导读:我们都知道,准备好的语句是SQL注入攻击的最佳方式之一.使用“IN”子句创建准备好的语句的最佳方法是什么?有没有一个简单的方法来做到这一点与未指定数量的价值观?以下列查询为例. SELECT ID,Column1,Column2 FROM MyTable WHERE ID IN (1,2,3) 目前,我正在
我们都知道,准备好的语句是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!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读