我有查询我正在使用绑定变量。查询就像
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 :(得分: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) 来处理逗号分隔的字符串。