0

我将参数传递给存储过程。一个参数是 a varchar(50),它可以是字符串,例如" > 5000"and " <= 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 参数完成的,因为它并不总是会使用=. 我需要说“如果售价不是 -1,那么 fld_SellingPrice @ sellPrice”。

4

4 回答 4

1

我会使用 from 和 to 变量。所以当你想要小于 5000 时,你设置为 variable = 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)
于 2012-05-31T11:32:23.303 回答
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。

于 2012-05-31T10:46:53.137 回答
1

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

所以像

DECLARE @sql nvarchar(MAX)

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

sp_executesql @sql

但是,这确实让您了解 SQL 注入的可能性,因此您必须要么

一个。确保该过程只会由您完全信任的调用者调用
b. 在程序中为格式错误的参数添加保护,这比听起来要困难得多
c. 找到一种完全解决问题的不同方法。

于 2012-05-31T10:43:20.013 回答
0

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

做到这一点的唯一方法(传入运算符)是使用动态 SQL,它有自己的缺陷。

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

于 2012-05-31T10:42:38.453 回答