将逗号分隔的数字作为SQL参数传递

时间:2012-08-29 12:14:25

标签: vb.net ado.net

我有查询我正在使用绑定变量。查询就像

Select...
From....
where Ids1 in (@SQLParameter1)
and  Ids2 in (@SQLParameter2)
and Ids3 in (@SQLParameter3)

我有@SQLParameter1@SQLParameter2@SQLParameter3的字符串格式值,所有数字都是逗号分隔的。我提到SQLParameter dataType为字符串,但Ids1,Ids2,Ids3是数字列,因此它会抛出错误。我尝试将DataType作为Varnumeric,但它没有用。

  

那么如何将逗号分隔的数字作为SQL参数???

传递

提前致谢..

4 个答案:

答案 0 :(得分:0)

每个命令参数只能传递一个值。像这样的值列表是不可能的。

您必须动态构建SQL。

string sql = String.Format(
    "SELECT * FROM tbl WHERE id1 IN ({0}) AND id2 IN ({1}) AND id3 IN ({2})",
    id1List, id2List, id3List
);

但要注意SQL注入。根据id列表的来源,您必须选择更复杂的方法并动态创建参数列表。

SELECT * FROM tbl
WHERE
    id1 IN (@1, @2, @3, @4) AND
    id2 IN (@5, @6, @7) AND
    id3 IN (@8, @9)

我不知道是否是这种情况,但如果三个ID构建主键,则此方法不会选择唯一的主键组合。在这种情况下,查询必须如下所示

SELECT * FROM tbl
WHERE
    (id1 = @1 AND id2 = @2 AND id3 = @3) OR
    (id1 = @4 AND id2 = @5 AND id3 = @6) OR
    (id1 = @7 AND id2 = @8 AND id3 = @9)

答案 1 :(得分:0)

如果您正在使用SQL Server 2008,则可以为每个Id集合创建一个带有表值参数的存储过程。见下文:

CREATE TYPE SQLParameter1TableType AS TABLE 
( 
    Id INT
);
GO

CREATE PROCEDURE dbo.TestStoredProcedure
(
    @SQLParameter1 SQLParameter1TableType READONLY
)
AS

Select...
From....
where Ids1 in (@SQLParameter1)
GO

DECLARE @SQLParameter1 AS SQLParameter1TableType;

INSERT INTO @SQLParameter1 (Id)
...select from

EXEC dbo.TestStoredProcedure @SQLParameter1;

当然,如果您正在使用ADO.NET,那么这里有一篇非常有用的文章,它将向您展示如何将表值参数与.NET结合使用(您需要将语言转换为VB.NET):http://orionseven.com/blog/2009/09/30/using-table-valued-parameters-in-sql-server-2008-and-c/

以下是SQL Server表值参数的MSDN文章:http://msdn.microsoft.com/en-us/library/bb510489.aspx

....或者你可以将逗号分隔的字符串传递给SQL Table-Valued函数,该函数拆分字符串并返回一个包含单列的表:

SELECT...
FROM....
where Ids1 in (SELECT * FROM dbo.SplitString(@SQLParameter1))

...或者您可以创建一个接受Id的标量函数,并检查它是否存在于提供的逗号分隔字符串中,相应地返回true / false:

SELECT...
FROM.... AS T
WHERE dbo.ExistsInCommaSeperatedString(T.Id, @SQLParameter1) = 1

答案 2 :(得分:0)

我使用动态SQL和快速正则表达式来处理这个问题,以抛弃任何不是数字或逗号的内容。我认为这可以保护事物。是否存在仅涉及数字和逗号的SQL注入攻击?我很想得到一个明确的答案。但这就是我在vb.net中所做的:

intStr =“1001,1002,1003”

Dim RegexObj As Regex = New Regex(“[^ \ d | ^ \,]”)

如果是RegexObj.IsMatch(intStr)那么     intStr =“0” 结束如果

SQL =“SELECT * FROM myTable WHERE ID IN(”& intStr&“)” 等。

答案 3 :(得分:0)

在 C# 中通过 ADO.NET 我们可以在下面传递逗号分隔值:

string intTransIds = string.Join(",", intTransId.ToArray()); db.AddInParameter(cmd, "@intTransIDs", DbType.String, intTransIds);

在存储过程方面,我们可以创建一个变量@intTransIDs varchar(max) 来处理逗号分隔的字符串。