Хранимая процедура 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.


person Brian R. Bondy    schedule 05.02.2009    source источник


Ответы (4)


См. настройку для - SET NOCOUNT.

person shahkalpeshp    schedule 05.02.2009
comment
+1 хоть и короткий, но указывает направление к правильному ответу - person Sam Saffron; 05.02.2009

Явно установите переменную в @@RowCount, а затем верните ее.

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

ИЗМЕНИТЬ

Он возвращает 0 для второй формы, потому что количество строк для выбора 0 в качестве ret равно 0 строк. Таким образом, вы захотите сохранить количество строк, возвращенных сразу после вашего удаления.

person cmsjr    schedule 05.02.2009
comment
Я не думаю, что вы поняли вопрос. Во втором случае он не возвращает строк. Проблема в том, что сначала нужно удалить, а потом выбрать. Он никогда не возвращает мне набор результатов. - person Brian R. Bondy; 05.02.2009
comment
Я действительно хочу, чтобы он возвращал 0 во втором случае. (Отсюда и SELECT 0 As Ret) Но проблема в том, что он ничего не возвращает. - person Brian R. Bondy; 05.02.2009
comment
Извините, я думал, вы занимаетесь манипулированием значением @@RowCount. Оба варианта, которые вы даете, возвращают мне результаты (с разными значениями @@Rowcount, доступными после выполнения). Возможно, вы могли бы поделиться дополнительным кодом, в котором вы не получаете значение. - person cmsjr; 05.02.2009
comment
Я не знаю, относится ли это к вашей ситуации, но я помню, что у меня были проблемы с некоторыми методами подключения, когда набор результатов был недоступен до тех пор, пока не было получено доступ к количеству затронутых записей. - person cmsjr; 05.02.2009

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

SET NOCOUNT ON 
DELETE FROM table where value1 = 1
SET NOCOUNT OFF
SELECT 0 As Ret
person Sam Saffron    schedule 05.02.2009
comment
Я думаю, что проблема может заключаться в том, что я в конечном итоге хотел изменить свой код на: УДАЛИТЬ ИЗ таблицы, где значение1 = 1 ВЫБРАТЬ @@ROWCOUNT - person Brian R. Bondy; 05.02.2009
comment
Остановит ли SET NOCOUNT ON заполнение @@ROWCOUNT? - person Brian R. Bondy; 05.02.2009
comment
нет .. @@ROWCOUNT всегда будет заполняться, у него есть некоторые крайние случаи использования с таблицами, у которых есть триггеры, для этого есть другие варианты - person Sam Saffron; 05.02.2009

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

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

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

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

person Brian R. Bondy    schedule 05.02.2009