|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74, при опции 0 сервер не будет выбрасывать исключение. Если по-прежнему Вы ловите исключение, то дело не в бобине, как говорится. То есть исключение Вы ловите в драйвере OLE DB провайдера. Разбирайтесь, что приходит от сервера. Может вам надо MARS включить, лучше уточните в конференции на C# или на чем пишете. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2021, 20:55 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74 msLex, Нет, там пусто... раз идет такая дискуссия х.п. о чем, то влепите в триггер SET NOCOUNT ON и как говорится отпешытесь тут ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 09:43 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
В общем по результатам исследований проблемы: 1. Проблема наблюдается только в PHP (Драйвер Microsoft SQL driver for PHP последней версии), повторить ситуацию в SSMS я не смог. Вообще не смог вызвать ни разу указанную ошибку, даже специально возвращая данные в триггерах. 2. Set nocount on, так же как и disallow results from triggers = 0 не помогают, так как никаких возвратов из триггеров, или из процедур, вызываемых из триггера, у меня нет, все проверил. При включенном disallow results from triggers = 1 SSMS сразу будет выдавать исключение при возврате данных из триггера, и в данном случае его (исключения) нет. 3. Как выяснилось, минимальный фрагмент на PHP, генерирующий ошибку, состоит из трех действий: а) открыть запрос А, выдающий несколько строк б) сделать fetch одной записи из запроса А в) выполнить процедуру Б, собственно добавляющую данные и вызывающую ошибку. Без открытого запроса А и прочитанной первой строки никаких ошибок не генерируется. Запрос А должен достигать определенной сложности по исполнению, при уменьшении сложности запроса сначала ситуация становилась нестабильной (Иногда появляется ошибка, иногда нет), при дальнейшем упрощении ошибка исчезала. Предполагаю, что проблема в том, что исполнение запроса для получения следующих строк идет асинхронно с основным потоком, т.е. одновременно с исполнением процедуры Б, которая каким-то боком воспринимает возвращаемые запросом А данные как возвращенные триггером. Буду рад комментарию знающих механику происходящего людей, сам в этом не особо разбираюсь, увы. Рекомендация (которая помогла): Не выполнять процедуры, вызывающие изменения в данных, одновременно с наличием открытых и не до конца прочитанных запросов. Либо делать это в разных транзакциях. (Хотя последнее надо бы проверить, что-то я уже сомневаюсь). То есть достаточно поменять шаги А, Б и В местами, и никаких ошибок больше не возникает. Либо между Б и В добавить чтение всех оставшихся записей запроса А. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 15:49 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74, так вы же должны вытянуть все данные, прежде, чем продолжать работу. У вас сессия-то занята получением данных. Вам лучше на форуме по PHP уточнить. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 16:12 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74 В общем по результатам исследований проблемы: 1. Проблема наблюдается только в PHP (Драйвер Microsoft SQL driver for PHP последней версии), повторить ситуацию в SSMS я не смог. Вообще не смог вызвать ни разу указанную ошибку, даже специально возвращая данные в триггерах. 2. Set nocount on, так же как и disallow results from triggers = 0 не помогают, так как никаких возвратов из триггеров, или из процедур, вызываемых из триггера, у меня нет, все проверил. При включенном disallow results from triggers = 1 SSMS сразу будет выдавать исключение при возврате данных из триггера, и в данном случае его (исключения) нет. 3. Как выяснилось, минимальный фрагмент на PHP, генерирующий ошибку, состоит из трех действий: а) открыть запрос А, выдающий несколько строк б) сделать fetch одной записи из запроса А в) выполнить процедуру Б, собственно добавляющую данные и вызывающую ошибку. Без открытого запроса А и прочитанной первой строки никаких ошибок не генерируется. Запрос А должен достигать определенной сложности по исполнению, при уменьшении сложности запроса сначала ситуация становилась нестабильной (Иногда появляется ошибка, иногда нет), при дальнейшем упрощении ошибка исчезала. Предполагаю, что проблема в том, что исполнение запроса для получения следующих строк идет асинхронно с основным потоком, т.е. одновременно с исполнением процедуры Б, которая каким-то боком воспринимает возвращаемые запросом А данные как возвращенные триггером. Буду рад комментарию знающих механику происходящего людей, сам в этом не особо разбираюсь, увы. Рекомендация (которая помогла): Не выполнять процедуры, вызывающие изменения в данных, одновременно с наличием открытых и не до конца прочитанных запросов. Либо делать это в разных транзакциях. (Хотя последнее надо бы проверить, что-то я уже сомневаюсь). То есть достаточно поменять шаги А, Б и В местами, и никаких ошибок больше не возникает. Либо между Б и В добавить чтение всех оставшихся записей запроса А. SET NOCOUNT ON - почитайте уже немного, ё*т, это же не про ваши возвращаемые рекордсеты из триггеров и процедур ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 16:14 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Ролг Хупин, там nocount вообще не при чём. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 16:36 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Владислав Колосов Nick74, так вы же должны вытянуть все данные, прежде, чем продолжать работу. У вас сессия-то занята получением данных. Вам лучше на форуме по PHP уточнить. Почему должен? В чем сложность в том же SSMS написать Код: sql 1. 2. 3. 4.
Работает на ура... Ну да, технически могут быть dirty reads, ну и фиг с ними. И главное технически обеспечить запрет подобного действия (Если оно вдруг запретное) на уровне драйвера не просто легко, а очень легко. Не сделали же. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 20:56 |
|
A trigger returned a resultset and/or was running with SET NOCOUNT OFF
|
|||
---|---|---|---|
#18+
Nick74, Почему должен? Писал выше, потому, что сеанс работает с одним потоком данных. Пока все данные не получены, вы не можете выполнять что-то еще, кроме получения данных. Если хотите в одном сеансе работать с несколькими наборами данных, то включайте MARS. Что на ура, пока пакет не отработает и не отгрузит все данные на клиента Вы не можете выполнять другой пакет. авторобеспечить запрет подобного действия Так обеспечили, вы получаете исключение. Смотрите и не видите. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2021, 22:14 |
|
|
start [/forum/topic.php?fid=46&msg=40120409&tid=1684003]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
171ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 236ms |
total: | 506ms |
0 / 0 |