2014-03-06 34 views
1

我想弄清楚获取查询以不同参数运行多次的最佳方式。我试图把它作为一个存储过程,并使用游标运行它,但我是游标概念的新手。这是查询和我第一次尝试使用游标。如何多次使用不同参数运行查询?

SELECT 
AVG([processingseconds]) 
FROM [nucor_historical_data].[dbo].[test_Lift_Matrix] 
Where ActualGauge between 0 and .21875 and ActualWidth between 0 and 55 
and inches between 0 and 120 and MaxLiftWeight between 0 and 10000 and 
processingseconds is not null 

所以我需要循环的参数在where语句中。对于您在另一个表格中看到的所有这些分组,我都有组合。

有人建议先从另一个堆栈问题试试这个问题,所以我测试了一个参数,但无法正常工作。有没有更好的方法来尝试这个?

DECLARE @param varchar(200) 

-- getting your parameter from the table 
DECLARE curs CURSOR LOCAL FAST_FORWARD FOR 
SELECT gauge FROM groupings 

OPEN curs 

FETCH NEXT FROM curs INTO @param 

-- executing your stored procedure once for every value of your parameter  
WHILE @@FETCH_STATUS = 0 BEGIN 
EXEC group_average @param 
FETCH NEXT FROM curs INTO @param 
END 

CLOSE curs 
DEALLOCATE curs 

回答

0

这是一个淡化的例子,你正在尝试做什么,即重复运行select语句,使用另一个表中的值作为输入。你需要去适应你的具体情况,我只是做你的字段的子集:

DECLARE @UniqueId int 
DECLARE @AgMin numeric(10,4) 
DECLARE @AgMax numeric(10,4) 

DECLARE @tmp TABLE (UniqueId INT, AgMin numeric(10,4), AgMax numeric(10,4)) 
INSERT @tmp SELECT ID, AGMIN, AGMAX FROM [YOUROTHERTABLEWITHTHESENUMBERS] 

    SELECT TOP 1 @UniueId=UniqueId, @AGMin=AGMin, @AGMAX=AgMax FROM @tmp 
    WHILE (@@rowcount > 0) 
    BEGIN 
    SELECT AVG([processingseconds]) FROM test_Lift_Matrix Where ActualGauge between @AGMIN and @AGMAX (the rest of your conditions...) 
    DELETE FROM @tmp WHERE [email protected] 
    SELECT TOP 1 @UniqueId=UniqueId, @AGMin=AGMin, @AGMAX=AgMax FROM @tmp 
    END 
+0

@ E.JBrennan这就像我所期待的事情。任何想法,当我得到一切设置,它只会返回一行,并为空? –

3

存储过程是这里的一种方式 - 将参数作为参数传递。

0

我认为你正在试图做的是一个执行动态查询有(因为改变where子句中)它的行为就像一个静态查询。

我想你的查询是根据来自客户端应用程序的标准执行的。

如果是这种情况,尝试通过sp_executesql执行的参数化动态查询字符串。

这是一种非常有效的技术。查看更多以下内容:

http://www.sommarskog.se/dyn-search-2005.html

+0

谢谢,这是我最终走向的地方。我会给文章一个阅读 –

相关问题