2009-02-05 3 views
0

У меня есть хранимая процедура, и если хранимая процедура делает это:MS SQL хранимая процедура возвращается наборы результатов с ODBC

SELECT 0 As Ret 
DELETE FROM table where value1 = 1 

возвращает результат 1 строку со значением 0 и именем столбца Ret

Но если я это сделаю:

DELETE FROM table where value1 = 1 
SELECT 0 As Ret 

Я не получаю никаких возвращенных результатов.

Вопрос в том, как получить второй вариант, чтобы вернуть значение.

Я использую C++ и ODBC.

ответ

0

Хорошо, я обнаружил, что вы можете использовать SQLMoreResults ODBC вызова, чтобы получить следующий набор результатов. Таким образом, вы можете продолжать называть эту функцию SQLMoreResults до тех пор, пока не останется больше наборов результатов.

В моем случае после вызова SQLMoreResults я получил ожидаемый результат.

Это довольно круто, потому что это означает, что одна хранимая процедура может возвращать несколько наборов результатов. Я никогда не знал, что это возможно.

@ Sambo99 и @shakalpesch Ваши предложения также работают и возвращают только 1 результат.

1

Явно устанавливает переменную @@ ROWCOUNT, а затем вернуть его

Declare @ret int 
Select @ret = @@RowCount 
Select @ret 

РЕДАКТИРОВАТЬ

Это возвращение 0 для второй формы, так как счетчика строк для выбора из 0, как RET равно 0 строк. Поэтому вы захотите сохранить количество строк, возвращаемых сразу после удаления.

+0

Я не думаю, что вы поняли вопрос. Он не возвращает строк во втором случае. Проблема состоит в том, что сначала выполняется удаление, а затем выбор. Он никогда не возвращает мне результирующий набор. –

+0

Я действительно хочу, чтобы он возвращал 0 во втором случае. (Следовательно, SELECT 0 As Ret). Но проблема в том, что он ничего не возвращает. –

+0

Прошу прощения, я думал, что вы занимаетесь манипулированием значением @ @ RowCount. Оба варианта, которые вы даете, возвращают мне результаты (с разными значениями @@ Rowcount, доступными после выполнения). Возможно, вы могли бы поделиться больше кода, в котором вы не получаете значение. – cmsjr

3

См. Настройку - SET NOCOUNT.

+0

+1 хотя и короткий, он указывает направление на правильный ответ –

1

shahkalpesh прав, nocount должен работать для этого, хотя я бы рекомендовал не использовать результирующий набор как возвращаемое значение и вместо этого использовать оператор RETURN и опросить возвращаемое значение proc.

SET NOCOUNT ON 
DELETE FROM table where value1 = 1 
SET NOCOUNT OFF 
SELECT 0 As Ret 
+0

Я думаю, что проблема может заключаться в том, что я в конечном итоге хотел изменить свой код на: УДАЛИТЬ ИЗ таблицы whre value1 = 1 SELECT @@ ROWCOUNT –

+0

УСТАНОВИЛ НАКОПЛЕНИЕ ON остановить @@ ROWCOUNT от заполнения? –

+0

nope [email protected]@ ROWCOUNT всегда будет заселен, у него есть некоторые краевые случаи вокруг использования с таблицами с триггерами, есть другие варианты для этого –

Смежные вопросы