我将参数传递给存储过程。一个参数是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;。
答案 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更差。