1

バインディング変数を使用しているクエリがあります。クエリは次のようになります

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

, ,の値を@SQLParameter1、すべての数値をカンマ区切りの文字列形式で持っています。SQLParameter dataType を文字列として言及しましたが、Ids1、Ids2、Ids3 は数値列であるため、エラーがスローされます。DataType を Varnumeric として試しましたが、うまくいきませんでした。@SQLParameter2@SQLParameter3

では、カンマ区切りの数値を SQL パラメータとして渡すにはどうすればよいでしょうか?

前もって感謝します..

4

4 に答える 4

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

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 テーブル値関数に渡すこともできます。この関数は、文字列を分割し、単一の列を持つテーブルを返します。

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

...または、ID を受け取り、指定されたコンマ区切り文字列に ID が存在するかどうかを確認し、それに応じて true/false を返すスカラー関数を作成することもできます。

SELECT...
FROM.... AS T
WHERE dbo.ExistsInCommaSeperatedString(T.Id, @SQLParameter1) = 1
于 2012-08-29T15:15:31.020 に答える
0

コマンド パラメータごとに値を 1 つだけ渡すことができます。このように値のリストを作成することはできません。

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)

これが当てはまるかどうかはわかりませんが、3 つの 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

ADO.NET を介した C# では、以下のコンマ区切りの値を渡すことができます。

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

ストアドプロシージャ側では、変数 @intTransIDs varchar(max) を作成して、コンマ区切りの文字列を処理できます。

于 2021-07-15T05:14:48.297 に答える