0

パラメータをストアド プロシージャに渡しています。1 つのパラメーターは、およびvarchar(50)のような文字列にすることができる aです。" > 5000"" <= 10000"

コードの一部を次に示します。

....
....
@colourid int = 0,
@regionid int = 0,
@sellingPrice varchar(50) = '-1'
AS
SELECT
....
....
WHERE
(dbo.tbl_Listings.fld_ColourID = CASE WHEN @colourid = 0 THEN dbo.tbl_Listings.fld_ColourID ELSE @colourid END)
AND (dbo.tbl_Listings.fld_RegionID = CASE WHEN @regionid = 0 THEN dbo.tbl_Listings.fld_RegionID ELSE @regionid END)
AND

@sellingPriceWHEREに追加するにはどうすればよいですか? 常に使用するとは限らないため、 int パラメーターに対してどのように行われたかを模倣することはできません=。「販売価格が -1 でない場合、fld_SellingPrice @sellingPrice」と言う必要があります。

4

4 に答える 4

1

これを実現する唯一の方法は、動的SQLを使用し、ローカル変数にクエリを作成してから、(できれば)を介して実行することsp_executesqlです。

だから何かのような

DECLARE @sql nvarchar(MAX)

SET @sql = 'SELECT .... WHERE ' + @sellingPrice

sp_executesql @sql

ただし、これによりSQLインジェクションの可能性が実際に開かれるため、次のいずれかを行う必要があります。

a。プロシージャが完全に信頼できる発信者によってのみ呼び出されることを確認してください
。プロシージャ内の不適切に形成されたパラメータに対する保護を追加します。これは、思ったよりもはるかに困難です
。問題に完全に取り組むための別の方法を見つけてください。

于 2012-05-31T10:43:20.013 に答える
0

これを SQL で直接行うことはできません。パラメーターは解析されず、述語を含むクエリの一部として解釈されません。

これを行う (演算子を渡す) 唯一の方法は、動的 SQLを使用することですが、これには落とし穴があります。

使用する演算子のパラメーターを渡すことを検討し、ifサポートされているパラメーターごとに多数のセクションを用意することを検討してください。これは、動的 SQL よりも悪い場合があります。

于 2012-05-31T10:42:38.453 に答える