2014-03-06 33 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

謝謝,這是我最終走向的地方。我會給文章一個閱讀 –

相關問題