2012-08-29 36 views
1

我有查询,我正在使用绑定变量。查询就像将逗号分隔的数字作为SQL参数传递

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参数传递?

在此先感谢..

回答

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) 
+0

解-1。我可以动态地委托查询,但使用绑定变量来提高性能。解决方案2和3在我的情况下没有用处。 – user1049021

0

如果您使用SQL Server 2008中,你可以创建一个具有标识的的每个集合表值参数的存储过程。请看下图:

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/

这里是MSDN文章为SQL Server表值参数:http://msdn.microsoft.com/en-us/library/bb510489.aspx

....或者你可以传递一个逗号分隔字符串转换成SQL表值函数分割字符串,并返回一个表单列:

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

...或者你可以创建,如果它存在于所提供的逗号分隔字符串,返回真/假据此接受ID和检查一个标量函数:

0

我处理这个使用动态SQL以及一个快速的正则表达式来抛出任何不是数字或逗号的东西。我认为这保护的东西。是否存在只涉及数字和逗号的SQL注入攻击?我很想得到一个明确的答案。但这是我做的,在vb。净:

intStr = “1001,1002,1003”

昏暗RegexObj作为正则表达式=新的正则表达式( “[^ \ d |^\,]”)

如果RegexObj.IsMatch(intStr)然后 intStr = “0” 结束如果

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

相关问题