Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблемы с разовым выполнением нескольких запросов  [new]
Rend
Member

Откуда:
Сообщений: 5
Задача - выполнить множество (несколько тысяч) похожих запросов вида
INSERT INTO #Table VALUES (x1,y1)
INSERT INTO #Table VALUES (x2,y2)
...
или аналогично для UPDATE.

MS SQL Server 2005, удалённый клиент TCP через ODBC.

В существующем коде запросы посылались по одному, захотелось ускорить.
Была попытка попытка переслать их разом на сервер в одном запросе. Переслать-то пересылалось, и даже выполнялось.

ret = SQLExecDirect(hstmt, (SQLWCHAR*)str.GetString(), SQL_NTS);
...
ret = SQLFreeStmt(hstmt, SQL_CLOSE);

ret = SQLExecDirect(hstmt, L"SELECT COUNT (*) FROM #Table", SQL_NTS);
Однако оказалось, что SQLExecDirect возвращается ещё до того, как все запросы выполнились. Если подождать чуток, то выполняется все. Но если сразу сделать SQLFreeStmt (чтобы дальше работать), то часть запросов не выполняется. Получается, что SQLFreeStmt обрывает выполнение списка запросов. То есть COUNT возвращает меньше строк, чем вставлялось.

Асинхронное выполнение (SQL_ATTR_ASYNC_ENABLE) - отключено. SQLExecDirect возвращает SQL_SUCCESS. Узнать, что что-то там 'в процессе' - не получается.

Попытка запихнуть всё это в хранимую процедуру, и выполнить процедуру, дала те же результаты - SQLExecDirect возвращает управление раньше, чем реально выполнится запрос, и SQLFreeStmt обрывает его выполнение.

Кто нибудь встречался с таким? И как это лечится?
31 май 11, 20:02    [10741409]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с разовым выполнением нескольких запросов  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Откуда беруться данные для VALUES(...)?
31 май 11, 20:06    [10741419]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с разовым выполнением нескольких запросов  [new]
Rend
Member

Откуда:
Сообщений: 5
Данные из клиентской пробраммы (не из SQL).
31 май 11, 20:12    [10741448]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с разовым выполнением нескольких запросов  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Rend,

А в клиентскую программу они попадают Духом Божьим?
31 май 11, 20:13    [10741454]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с разовым выполнением нескольких запросов  [new]
Rend
Member

Откуда:
Сообщений: 5
pkarklin
А в клиентскую программу они попадают Духом Божьим?

Они там рассчитываются, изменяются и живут своей жизнью. Меняются регулярно (в пределах минуты), как сами, так и от пинка пользователя.

Здесь, скорее, вопрос не в самих данных, а что это за скрытая асинхронность ODBC/SQL и как с ней быть. Иначе молчаливо теряются данные.
31 май 11, 20:23    [10741480]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с разовым выполнением нескольких запросов  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
На клиенте сформируйте XML. На сервере создайте хп, принимающую параметр XML и делающую вставку всего набора одной инструкцией. Не издевайтесь ни над собой, ни над сервером.
31 май 11, 20:27    [10741489]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с разовым выполнением нескольких запросов  [new]
Rend
Member

Откуда:
Сообщений: 5
Проскакивала такая мысль, но ещё не пробовал. Есть сомнения касательно производительности, но ясно будет только после тестов.
31 май 11, 20:38    [10741510]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с разовым выполнением нескольких запросов  [new]
Rend
Member

Откуда:
Сообщений: 5
Решение оказалось простым - ODBC на каждый запрос ждёт подтверждения. Нужно сделать пачку SQLFetch(), пока не придёт SQL_NODATA. Тогда действительно выполнятся все запросы.
1 июн 11, 09:23    [10742922]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Проблемы с разовым выполнением нескольких запросов  [new]
SQLhunter
Member

Откуда:
Сообщений: 72
Rend,

Спасибо тебе, Rend. И спасибо форуму. Часов 40 бился с этим парадоксом синхронной асинхронности от микрософта.
4 апр 15, 19:44    [17474048]     Ответить | Цитировать Сообщить модератору
 Re: Проблемы с разовым выполнением нескольких запросов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
SQLhunter
Rend,

Спасибо тебе, Rend. И спасибо форуму. Часов 40 бился с этим парадоксом синхронной асинхронности от микрософта.
Вообще этот вопрос не имеет отношения к сиквелу, нужно было задать его в форуме по языку программирования.
Поведение такое есть, это да. Почему так сделано - очевидно. По другому делать нельзя.

И в данном случае более правильное решение - это не передавать данные о выполнении каждого стейтмента на клиента, используя SET NOCOUNT ON. Зачем ТС тысячи актов обмена сервер-клиент - непонятно, это же замедляет приложение, перегружает сеть и сервер. Жаль, тогда, в 2011 году, ему никто не подсказал.
4 апр 15, 19:58    [17474086]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить