1

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

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

4 回答 4

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/博客/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 表值函数,该函数拆分字符串并返回具有单列的表:

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

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

SELECT...
FROM.... AS T
WHERE dbo.ExistsInCommaSeperatedString(T.Id, @SQLParameter1) = 1
于 2012-08-29T15:15:31.020 回答
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)
于 2012-08-29T14:42:39.020 回答
0

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

intStr = "1001,1002,1003"

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

If RegexObj.IsMatch(intStr) Then intStr = "0" End If

SQL = "SELECT * FROM myTable WHERE ID IN (" & intStr & ")" 等..

于 2013-03-19T16:32:44.940 回答
0

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

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

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

于 2021-07-15T05:14:48.297 回答