2011-09-27 31 views
2

在SQL Server中的CURSOR我們說:確定光標通過條件

CREATE PROCEDURE SP_MY_PROC 
       (@BANKID VARCHAR(6)='') 
------------------------------- 
------------------------------- 

    DECLARE MY_CURSOR CURSOR FOR 
    SELECT ....... 

現在,我在想,我們能確定根據cerain條件的select語句?

IF BANKID<>''// SELECT * FROM EMPLOYESS WHERE [email protected] to be the cursors query 
ELSE // otherwise SELECT * FROM EMPLOYEES to be the cursors query 

還是它必須是靜態的?

+1

請給出條件的詳細信息。您想要添加哪種類型的條件? –

回答

2

是的,你可以用動態SQL這樣做

IF @BANKID<> '' 
    SET @sql = ' 
     DECLARE MyCursor CURSOR FOR 
      SELECT ...' 
ELSE 
    SET @sql = ' 
     DECLARE MyCursor CURSOR FOR 
      SELECT ...' 

EXEC sp_executesql @sql 
OPEN MyCursor 
+0

但是SQL Server不會抱怨,因爲它不知道MyCursor。 MyCursor在一個字符串中。 –

+0

@Mikayil - 你可以聲明它是一個[全局光標](http://msdn.microsoft.com/en-us/library/ms180169.aspx) - 直到你的連接關閉纔會有效。 –

+0

我其實並沒有把它聲明爲全局變量,但它不會抱怨。命令成功完成。 –

2

如果它是這樣一個簡單的例子,最好把它重新寫爲一個單一的查詢:

DECLARE MY_CURSOR CURSOR FOR 
    SELECT * FROM EMPLOYESS WHERE [email protected] or @BANKID='' 

而且,中當然,我們還沒有解決遊標是否是解決較大問題的正確解決方案(遊標經常被不習慣思考基於集合的解決方案的人濫用,這正是SQL擅長的)。


PS - 避免與sp_前綴存儲過程 - 這些名稱是「保留」的SQL Server,並應避免以防止未來的不兼容(而忽略了,現在,它的速度也較慢訪問存儲的特效使用這樣的名稱,因爲SQL Server在搜索當前數據庫之前搜索主數據庫)。

+0

我知道,但查詢是完全不同的。我只是把它寫成了@Upendra Chaudhari的例子。我需要使用遊標,因爲我將檢查列值並根據每個記錄的值執行操作。 –

+1

@Mikayil - 很難找到兩個查詢完全不同的組合,但是消費這些查詢結果的任何東西都可以使用結果集,而不會將查詢關聯得足夠緊密,從而無法合併成一個查詢。 –

+0

@Damien_The_Unbeliever - 在數據庫應用程序開發中可能很少見,但有很多數據庫工作是臨時或管理的,在這種情況下它可能非常有用。我認爲當他們對數據庫相關問題的第一個回答是「你不想這樣做,因爲你不應該這樣做在數據庫中」時,人們完全忘記了這一點。 – briantyler