Определить курсор по условию - PullRequest
2 голосов
/ 27 сентября 2011

В SQL Server для CURSOR мы говорим:

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

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

Теперь, что мне интересно, можем ли мы определить оператор select согласно условию cerain?

IF BANKID<>''// SELECT * FROM EMPLOYESS WHERE BANKID=@BANKID to be the cursors query
ELSE  // otherwise SELECT * FROM EMPLOYEES  to be the cursors query   

Или оно должно быть статичным?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Если это такой простой пример, лучше переписать его как один запрос:

DECLARE MY_CURSOR CURSOR FOR
    SELECT * FROM EMPLOYESS WHERE BANKID=@BANKID or @BANKID=''

И, разумеется, мы не рассмотрели вопрос о том, является ли курсор правильным решением для более крупной проблемы или нет (курсоры часто неправильно используются людьми, которые не привыкли думать о решениях на основе множеств, что хорошо для SQL). .


PS - избегайте префикса ваших хранимых процедур с sp_ - Эти имена «зарезервированы» для SQL Server, и их следует избегать, чтобы предотвратить будущие несовместимости (и игнорировать, на данный момент, что также медленнее получить доступ к хранимым процессам с такими имена, так как SQL Server выполняет поиск в базе данных master перед поиском в текущей базе данных).

2 голосов
/ 27 сентября 2011

Да, вы можете сделать это с помощью динамического SQL

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

EXEC sp_executesql @sql 
OPEN MyCursor
...