Курсор SQL Server для включения значения в Select - PullRequest
2 голосов
/ 30 декабря 2010

У меня есть оператор SELECT, возвращающий набор строк.

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

Например:

DECLARE @col1 int
DECLARE @col2 int
DECLARE @col3 varchar(20)

DECLARE myCursor CURSOR FOR
SELECT col1, col2, col3
FROM table1
WHERE....

OPEN myCursor
FETCH NEXT FROM myCursor
INTO @col1, @col2

WHILE @@FETH_STATUS = 0
BEGIN
  SET @col3 = EXEC proc_GetCol3_Value @col1, @col2

  FETCH NEXT FROM myCursor
  INTO @col1, @col2
END

CLOSE myCursor
DEALLOCATE myCursor

Теперь, исходя из этого, я хочу вернуть строки, полученные исходным курсором, плюс значение, полученное изХранимая процедура выполняется как значение столбца 3.

Скажем, строки, возвращаемые курсором SQL:

col1  col2  col3
  1   5000
  2   5000
  3   2500
  4   2000

И мне нужно, чтобы все столбцы были предоставлены после запуска курсора и сохраненного процесса, а набор результатовbe:

col1  col2  col3
  1   5000  APPROVED
  2   5000  REJECTED
  3   2500  CANCELLED
  4   2000  APPROVED

Любые идеи приветствуются.Спасибо.

PS Я знаю, что многие посоветовали бы просто использовать оператор JOIN, но поскольку хранимая процедура, которую нужно выполнить, довольно сложна, создание соединения с оператором SQL курсора было бы слишком сложным.

Ответы [ 2 ]

3 голосов
/ 30 декабря 2010

Если по какой-то причине вы не можете перейти к функции:

DECLARE @col1 int 
DECLARE @col2 int 
DECLARE @col3 varchar(20) 
DECLARE @Output (col1 int, col2 int, col3 varchar (20))

DECLARE myCursor CURSOR FOR 
    SELECT col1, col2, col3 FROM table1 WHERE....  
OPEN myCursor 
FETCH NEXT FROM myCursor INTO @col1, @col2  
WHILE @@FETH_STATUS = 0 
BEGIN   
    SET @col3 = EXEC proc_GetCol3_Value @col1, @col2

    INSERT INTO @Output (col1, col2, col3)
    VALUES @col1, @col2, @col3

FETCH NEXT FROM myCursor   INTO @col1, @col2 
END  
CLOSE myCursor 
DEALLOCATE myCursor 

SELECT col1, col2, col3 from @Output
1 голос
/ 30 декабря 2010

Если вы не используете хранимую процедуру proc_GetCol3_Value, я настоятельно рекомендую отказаться от курсора, который вы используете, и превратить вашу хранимую процедуру в пользовательскую функцию.

Хотя я не фанат пользовательских функций (из-за проблем с производительностью), возможно, стоит использовать их. Скорее всего, вы можете перенести код вашей хранимой процедуры в пользовательскую функцию (мы назовем ее func_GetCol3_Value), которая возвращает статус, и теперь ваш запрос может быть просто:

SELECT col1, col2, func_GetCol3_Value(col1, col2) as col3
FROM table1

В зависимости от того, насколько простой или сложной является ваша хранимая процедура, вам может даже не понадобиться функция, но сначала нам нужно будет увидеть код, чтобы сказать.

...