如何使用不同的参数多次运行查询?

时间:2014-03-06 22:20:54

标签: sql sql-server tsql

我正在尝试找出使用不同参数运行多次查询的最佳方法。我已经尝试将它作为存储过程并使用游标运行它,但我对光标概念很新手。这是查询和我第一次使用光标。

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

3 个答案:

答案 0 :(得分:4)

存储过程就是这里的方法 - 将参数作为参数传递。

答案 1 :(得分: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 UniqueId=@UniqueId
    SELECT TOP 1  @UniqueId=UniqueId, @AGMin=AGMin, @AGMAX=AgMax FROM @tmp
  END

答案 2 :(得分:0)

我认为你要做的是执行动态查询(因为更改了where子句),使其行为像静态查询一样。

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

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

这是一种非常有效的技术。请参阅以下内容:

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