Здравствуйте, AWRoraInc, Вы писали:
AWR>Есть хранимая процедура, которая возвращает 4 набора данных (рекордсета). AWR>На клиенте я пользуюсь одним из четырех (в зависимости от условия)
AWR>Вопрос: AWR>Допустим из 4-ех наборов мне нужен только 3-й. AWR>Как сделать, чтобы хранимая процедура возвращала ТОЛЬКО 1 набор данных?
Переписать процедуру так, чтоб там был тока 1 SELECT, который бы возвращал данные. Если возможности изменить хп, то на клиенте при использовании ADO юзать метод NextRecordset.
Re[2]: MS SQL Server: процедура возвращает несколько рекордс
Здравствуйте, pkarklin, Вы писали:
P>Переписать процедуру так, чтоб там был тока 1 SELECT, который бы возвращал данные. Если возможности изменить хп, то на клиенте при использовании ADO юзать метод NextRecordset.
ну такой подход мне известен,
но я считаю его "некрасивым"
думаю, что на самом серваке должна быть какая-то хрень.
тем более, что меня об этом спросили на одном собеседовании,
а я не знал че ответить толковое.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
@VRora
Re[3]: MS SQL Server: процедура возвращает несколько рекордс
Здравствуйте, AWRoraInc, Вы писали:
AWR>Здравствуйте, pkarklin, Вы писали:
P>>Переписать процедуру так, чтоб там был тока 1 SELECT, который бы возвращал данные. Если возможности изменить хп, то на клиенте при использовании ADO юзать метод NextRecordset.
AWR>ну такой подход мне известен, AWR>но я считаю его "некрасивым" AWR>думаю, что на самом серваке должна быть какая-то хрень.
Нет никакой "хрени"!!! Скока Вы написали SELECT в хп, стока она наборов и вернет (если это не SELECT INTO). Более того, на сервере Вы вообще можете получить только первый из возвращаемых наборов, в отличаи от клиента.
AWR>тем более, что меня об этом спросили на одном собеседовании, AWR>а я не знал че ответить толковое.
Точную формулировку вопроса с собеседования можете привести?
Re[4]: MS SQL Server: процедура возвращает несколько рекордс
Здравствуйте, AWRoraInc, Вы писали:
AWR>Здравствуйте, pkarklin, Вы писали:
P>>Точную формулировку вопроса с собеседования можете привести?
AWR>так и спросили: как вернуть из 4 рекордсетов 2-ой без NextRecordset? AWR>потом что-то говорили про NOCOUNT ON/OFF, но я попробывал — не канает!
Мдя...
Видимо тот, кто проводил собеседование сам не знал, вот Вас и спросил.
Re[5]: MS SQL Server: процедура возвращает несколько рекордс
Здравствуйте, AWRoraInc, Вы писали:
AWR>Здравствуйте, pkarklin, Вы писали:
P>>Точную формулировку вопроса с собеседования можете привести?
AWR>так и спросили: как вернуть из 4 рекордсетов 2-ой без NextRecordset? AWR>потом что-то говорили про NOCOUNT ON/OFF, но я попробывал — не канает!
Не пойму ...
вам задали вопрос, вы не дали ответ
вы спросили ПРАВИЛЬНЫЙ ответ? что вам ответили?
Re[6]: MS SQL Server: процедура возвращает несколько рекордс
Здравствуйте, KGP, Вы писали:
AWR>>так и спросили: как вернуть из 4 рекордсетов 2-ой без NextRecordset? AWR>>потом что-то говорили про NOCOUNT ON/OFF, но я попробывал — не канает!
KGP>Не пойму ... KGP>вам задали вопрос, вы не дали ответ KGP>вы спросили ПРАВИЛЬНЫЙ ответ? что вам ответили?
СОБЕСЕДОВАНИЕ БЫЛО ДАВНО,
поэтому помню смутно,
но тепрь вспомнил, потому как самому понадобилось.
они задали вопрос о 2-ом рекордсете из 4-х
я сказал, что делаю NextRecordset
они спросили а как без него?
я сказал, что не знаю...
они началаи говорить: а вы не пробывали NOCOUNT ON/OFF,
для достиженеия такого эффекта
я говорю — Нет..
на этом разгворо закончился...
я пришел домой и попробывал NOCOUNT ON/OFF — все рвно возвращает 4 рекордсета
-------------
А вообще думаю, что если нет другого решения кроме NextRecordset и писания хранимки так чтобы возвращала 1 рекордсет, то тема закрывается!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
@VRora
Re[7]: MS SQL Server: процедура возвращает несколько рекордс
Здравствуйте, AWRoraInc, Вы писали:
AWR>Здравствуйте, KGP, Вы писали:
AWR>>>так и спросили: как вернуть из 4 рекордсетов 2-ой без NextRecordset? AWR>>>потом что-то говорили про NOCOUNT ON/OFF, но я попробывал — не канает!
KGP>>Не пойму ... KGP>>вам задали вопрос, вы не дали ответ KGP>>вы спросили ПРАВИЛЬНЫЙ ответ? что вам ответили? AWR>СОБЕСЕДОВАНИЕ БЫЛО ДАВНО, AWR>поэтому помню смутно, AWR>но тепрь вспомнил, потому как самому понадобилось.
AWR>они задали вопрос о 2-ом рекордсете из 4-х AWR>я сказал, что делаю NextRecordset AWR>они спросили а как без него? AWR>я сказал, что не знаю... AWR>они началаи говорить: а вы не пробывали NOCOUNT ON/OFF, AWR>для достиженеия такого эффекта
AWR>я говорю — Нет.. AWR>на этом разгворо закончился...
Те, кто задавал тебе такие вопросы были просто не компетенты
Re[7]: MS SQL Server: процедура возвращает несколько рекордс
Здравствуйте, AWRoraInc, Вы писали:
AWR>Здравствуйте, pkarklin, Вы писали:
P>>Точную формулировку вопроса с собеседования можете привести?
AWR>так и спросили: как вернуть из 4 рекордсетов 2-ой без NextRecordset? AWR>потом что-то говорили про NOCOUNT ON/OFF, но я попробывал — не канает!
Да нет, я думаю имелось в виду следущее.
Когда выставлен SET NOCOUNT OFF, то для каждого запроса возвращается 2 рекордсета (для ADO по крайней мере, но думаю для некоторых других тоже): один для числа затронутых записей и второй собственно результат. Если же выставить SET NOCOUNT ON, то рекордсет с числом записей не придет, а придет сразу тот, который при SET NOCOUNT OFF был вторым, т.е. типа сразу получил второи рекордсет.
Re[6]: MS SQL Server: процедура возвращает несколько рекордс
Здравствуйте, Docker, Вы писали:
D>Да нет, я думаю имелось в виду следущее. D>Когда выставлен SET NOCOUNT OFF, то для каждого запроса возвращается 2 рекордсета (для ADO по крайней мере, но думаю для некоторых других тоже): один для числа затронутых записей и второй собственно результат. Если же выставить SET NOCOUNT ON, то рекордсет с числом записей не придет, а придет сразу тот, который при SET NOCOUNT OFF был вторым, т.е. типа сразу получил второи рекордсет.
SET NOCOUNT ON\OFF запрещает\разрешает отправку на клиента сообщения DONE_IN_PROC для каждой инструкции DML. Но это не набор данных!!! QA отображает это сообщение в виде N row(s) affected. А вот ADO, например, считает, получая это сообщение, например при открытии хп, содержащей более 1 инструкции DML (например, вставка во временную таблицу и уже выборка из нее), что хп отработала и получает "пустой" набор. Для этого и ставят SET NOCOUNT ON. Но это не иммет никакого отношения к получению действительно нескольких наборов данных.
Re[7]: MS SQL Server: процедура возвращает несколько рекордс
Здравствуйте, pkarklin, Вы писали:
P> А вот ADO, например, считает, получая это сообщение, например при открытии хп, содержащей более 1 инструкции DML (например, вставка во временную таблицу и уже выборка из нее), что хп отработала и получает "пустой" набор.
На самом деле это даже не ADO, а OLEDB провайдер... А вот, например, с ODBC такого прикола нет.
Вообще провайдер на запрос, вместе с рекордсетом, должен вернуть информацию о том сколько записей обработано, и прочую лабуду... И существуют такие понятия как non returning row и returning row команды, и для non returning row тоже надо как-то возвращать эту информацию. OLEDB провайдер (при NOCOUNT OFF) поступает просто — возвращает рекордсет в состоянии closed, но со служебной информацией сколько записей обработано. При NOCOUNT ON служебной информации нет и возвращать нечего, ну и лишний recordset на клиента при этом не приезжает...
... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[7]: MS SQL Server: процедура возвращает несколько рекордс
...
P>SET NOCOUNT ON\OFF запрещает\разрешает отправку на клиента сообщения DONE_IN_PROC для каждой инструкции DML. Но это не набор данных!!! QA отображает это сообщение в виде N row(s) affected. А вот ADO, например, считает, получая это сообщение, например при открытии хп, содержащей более 1 инструкции DML (например, вставка во временную таблицу и уже выборка из нее), что хп отработала и получает "пустой" набор. Для этого и ставят SET NOCOUNT ON. Но это не иммет никакого отношения к получению действительно нескольких наборов данных.
Да, я это понимаю и на 100% согласен. Но поскольку начали разбираться, что же могли иметь в виду те кто проводил интервью, спрашивая, грубо говоря, "Как получить второй рекордсет (подсказка — используя SET NOCOUNT ON"), я высказал свое предположение. Хотя безусловно вопрос мне тоже кажется странным.