我们都知道,准备好的语句是sql注入攻击的最佳方式之一.使用“IN”子句创建准备好的语句的最佳方法是什么?有没有一个简单的方法来做到这一点与未指定数量的价值观?以下列查询为例.
SELECT ID,Column1,Column2 FROM MyTable WHERE ID IN (1,2,3)@H_403_2@目前,我正在使用一个循环覆盖我可能的值来构建一个字符串,如.
SELECT ID,Column2 FROM MyTable WHERE ID IN (@IDVAL_1,@IDVAL_2,@IDVAL_3)@H_403_2@SELECT ID,Column2 FROM MyTable WHERE ID IN (@IDArray)@H_403_2@如果重要的是我正在使用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@H_403_2@然后使用以下…
Declare @CommaSeparated varchar(50) Set @CommaSeparated = '112,112,122' SELECT ID,Column2 FROM MyTable WHERE ID IN (select col FROM [SeparateValues](@CommaSeparated,','))@H_403_2@UPDATE
您将使用以下语法来挤压一些额外的性能…
SELECT ID,Column2 FROM MyTable Cross Apply [SeparateValues](@CommaSeparated,') s Where MyTable.id = s.col@H_403_2@因为以前的语法导致sql Server使用“IN”子句运行额外的“Sort”命令.加上 – 在我看来,它看起来更好:D!