1

現在、長いクエリがあり、そのようなステートメントと交互にしたい

where userid=@userid

ただし、フローを変更する他のパラメーターがあるため、1 人のユーザーまたは任意のユーザーを選択する 2 つのオプションが必要です。

選択して使用できるようにユーザー名を送信できますか? LIKE ステートメントで行うように、送信します

where username LIKE "%%"

すべてのレコードを取得しますが、INT を使用してそれを行うにはどうすればよいでしょうか?

私のクエリはパラメータ化されているため、「OR 1=1」のように追加できません

where userid=1 or 1=1

BETWEEN を使用して 2 つのパラメーターを取得する必要があるため、1 つのレコードを選択するときに、userid-1 と userid+1 を 2 つのパラメーターとして入力し、1 人のユーザーを取得します。すべてを選択する場合は、1 を入力し、 100万。

パラメータ化されたクエリの論理的な方法ですか、それとも 1 つのパラメータを使用する別の方法がありますか?

解決 これが私がソリューションを使用する方法です。右側のまたは列を使用すると、SQLが壊れます。

4

4 に答える 4

10

通常、これは次を使用して行われます

WHERE userid = @userid OR @userid IS NULL

別のバリエーション (userid 列がヌル可能でない場合):

WHERE userid = COALESCE(@userid, userid)

さらに別の(intの場合)と言うのは

WHERE userid BETWEEN COALESCE(@userid, 1)
    AND COALESCE(@userid, 2000000000); -- well, 2147whatever

ただし、これらの条件が多数あり、クエリが実行されるたびにパラメーターが変更される場合、常に適切であるとは限らない不適切な計画に陥る可能性があります。そのため、動的 SQL を生成することが答えになる場合もあります。

SET @sql = @sql + CASE WHEN @userid IS NOT NULL THEN 
    N' AND userid = ' + CONVERT(VARCHAR(12), @userid);

これをOPTION RECOMPILE「アドホック ワークロードに合わせて最適化する」インスタンス設定と組み合わせると、複数回実行されるクエリのバージョンのプランだけがプラン キャッシュに詰め込まれます。

于 2012-06-15T17:44:05.103 に答える
1
where userId > -1

それはうまくいくでしょうか?

于 2012-06-15T17:44:06.810 に答える
0

パラメーター化されたクエリは、SQL インジェクションが発生しないようにするために存在します。のようなパラメータや WHERE 句を使用しない特定のクエリを作成してみませんSELECT * FROM usersか?

于 2012-06-15T17:43:55.043 に答える