SQL条件语句包含运算符

时间:2012-05-31 10:35:01

标签: sql sql-server sql-server-2008 tsql

我将参数传递给存储过程。一个参数是varchar(50),可以是" > 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

如何将@sellingPrice添加到WHERE?我无法模仿int参数的完成方式,因为它并不总是使用=。我需要说&#34;如果售价不是-1那么fld_SellingPrice @ sellingPrice&#34;。

4 个答案:

答案 0 :(得分:1)

实现这一目标的唯一方法是使用动态SQL,在局部变量中构建查询,然后通过(最好)sp_executesql执行它。

类似

DECLARE @sql nvarchar(MAX)

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

sp_executesql @sql

但是,这确实打开了SQL注入的可能性,因此你必须

一个。请确保该程序仅由您完全信任的呼叫者调用 湾为你的程序中的错误形成的参数添加保护,这比听起来要困难得多 C。找到一种完全解决问题的不同方法。

答案 1 :(得分:1)

如果您知道要进行一般性的比较,我会在您的SP中为每个比较创建一个参数,并根据需要使用它们。所以你的SP可能有

 @greaterThan int,
 @lessThan int,
 @equalTo int

然后在SP中你可以做

if @greaterThan IS NULL
    SELECT @greaterThan = MAX(field) FROM table -- or some arbitrary value that will always evaluate to true
if @lessThan IS NULL
    SELECT @lessThan = MIN(field) FROM table

然后只使用WHERE子句中的那些。否则,如发布的那样,您将不得不通过使用WHERE子句的部分构建SQL字符串来执行动态SQL。

答案 2 :(得分:1)

我会使用from和a变量。 所以当你想要小于5000时,你设置为变量= 5000并从空白

....
....
@colourid int = 0,
@regionid int = 0,
@fromsellingprice int = 5000
@tosellingprice int = null
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
sellingPrice >= coalesce(@fromsellingprice, sellingprice)
and sellingPrice <= coalesce(@tosellingprice, sellingprice)

答案 3 :(得分:0)

您不能直接在SQL中执行此操作 - 该参数不会被解析为具有谓词的查询的一部分。

执行此操作的唯一方法(传入运算符)是使用dynamic SQL,它有自己的陷阱。

您可以考虑传入一个参数来使用哪个运算符,并为每个支持的参数设置一堆if部分 - 这可能比动态SQL更差。