在一个参数中调用具有多个值的过程

时间:2014-03-25 18:44:26

标签: sql sql-server

我有这段代码,我称之为:

EXECUTE get_all_featured @page = 1, @tipoleilao = 2

我的目标是调用此程序并在arg @tipoleilao中设置例如@tipoleilao = 2 and 1

CREATE PROCEDURE get_all_featured
@page int,
@tipoleilao int
AS
SELECT *, (rowNum / 8) + 1 as page
FROM (
    SELECT *, Row_Number() OVER (ORDER BY items.data_exp DESC) as rowNum
    FROM items INNER JOIN utilizadores ON items.autor = utilizadores.id_user WHERE activo = '1' and tipo_leilao = @tipoleilao and sold = '0'
    and featured = '1' and tipo_leilao != 3
) x 
WHERE (rowNum / 8) + 1 = @page

我该怎么做?

1 个答案:

答案 0 :(得分:0)

这是一个很好的机会,可以在这个问题上引用Erland Sommarskog的essay。有许多解决方案,最好的解决方案取决于许多因素。

如果您要比较的列没有编入索引,并且您想要一个快速简便的解决方案,我会被简单的逗号分隔列表所吸引:

CREATE PROCEDURE get_all_featured
@page int,
@tipoleilao varchar(255)
AS BEGIN
. . . 

SELECT . . .
WHERE ','+@tipoleilao+',' like '%,'+cast(tipo_leilao as varchar(255))+'%,' . . ..

我可以听到关于这种方法的呻吟声,但它通常在调用存储过程之前需要最少量的编码。而且,它可以让人类输入值列表。

从这个简单的开始,你有很多选择。您可以采用这样的列表并在其上使用split()函数。您可以创建用户定义的表类型,并将变量作为表类型传递。您可以在存储过程和调用者之间共享一个公共全局临时表。毫无疑问,Erland讨论了更多奇特的方法