Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
адо Member Откуда: Сообщений: 24 |
Здравствуйте, коллеги. Есть вот такой код: IF OBJECT_ID('tempdb.dbo.#mytemptable') IS NOT NULL DROP TABLE dbo.#mytemptable; CREATE TABLE dbo.#mytemptable ( id CHAR(9), descr VARCHAR(1000) ); DECLARE @id CHAR(9) DECLARE @descr VARCHAR(70) DECLARE cur CURSOR LOCAL READ_ONLY FAST_FORWARD FOR SELECT t1.ID as id, t3.DESCR as descr FROM t1 INNER JOIN t2 (NOLOCK) ON t2.PARENTEXT = t1.ID INNER JOIN t3 as ON t3.ID = t2.t3id WHERE t2.IsMark = 0 ORDER BY id OPEN cur FETCH NEXT FROM cur INTO @id, @descr WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO #mytemptable( id, descr) VALUES(@id, @descr) FETCH NEXT FROM cur INTO @id, @descr END CLOSE cur DEALLOCATE cur; Код упрощен для отладки, так что на "физический смысл" не обращайте внимания. Проблема вот в чем. Запрос SELECT t1.ID as id, t3.DESCR as descr FROM t1 INNER JOIN t2 (NOLOCK) ON t2.PARENTEXT = t1.ID INNER JOIN t3 as ON t3.ID = t2.t3id WHERE t2.IsMark = 0 ORDER BY id возвращает более 6000 записей, а запрос по результирующей таблице SELECT * FROM #mytemptable возвращает примерно 160-170 записей (при каждом выполнении разное число!!!) Причем это именно первые 160-170 записей из верхнего запроса. Получается, что цикл по курсору не обходит все строки, а вылетает где-то раньше времени по непонятной причине. Как такое вообще возможно и куда теперь копать? |
20 май 14, 16:07 [16043465] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
А как число записей в таблице #mytemptable показывает число итераций цикла WHILE ? И как вы обрабытываете ошибки выполнения вашего кода ? |
||
20 май 14, 16:16 [16043523] Ответить | Цитировать Сообщить модератору |
адо Member Откуда: Сообщений: 24 |
А какие еще могут быть причины непопадания записей в эту таблицу? |
||
20 май 14, 16:29 [16043610] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
|
||||
20 май 14, 16:30 [16043618] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
адо, а если попробовать объявить курсор статическим? |
20 май 14, 16:33 [16043638] Ответить | Цитировать Сообщить модератору |
адо Member Откуда: Сообщений: 24 |
А какое они имеют значение? Проблема то фиксируется в уже упрощенном коде, в том, который приведен выше. |
||||
20 май 14, 16:33 [16043646] Ответить | Цитировать Сообщить модератору |
адо Member Откуда: Сообщений: 24 |
Попробовал. Нет, не помогает. |
||
20 май 14, 16:38 [16043672] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
И где же она фиксируется то ? Вы трассировали число итераций в Профайлере, например ? |
||
20 май 14, 16:39 [16043680] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
|
||||
20 май 14, 16:41 [16043692] Ответить | Цитировать Сообщить модератору |
адо Member Откуда: Сообщений: 24 |
Нет. Ситуация осложняется тем, что доступа к инструментальным средствам MS-SQL нет, есть доступ только к клиентскому приложению. Так что я могу только исполнять запросы и выводить результаты. |
||||
20 май 14, 16:46 [16043723] Ответить | Цитировать Сообщить модератору |
адо Member Откуда: Сообщений: 24 |
IF OBJECT_ID('tempdb.dbo.#mytemptable') IS NOT NULL DROP TABLE dbo.#mytemptable; CREATE TABLE dbo.#mytemptable ( id CHAR(9), descr VARCHAR(1000) ); DECLARE @id CHAR(9) DECLARE @descr VARCHAR(70) DECLARE cur CURSOR LOCAL READ_ONLY FAST_FORWARD FOR SELECT t1.ID as id, t3.DESCR as descr FROM t1 INNER JOIN t2 (NOLOCK) ON t2.PARENTEXT = t1.ID INNER JOIN t3 as ON t3.ID = t2.t3id WHERE t2.IsMark = 0 ORDER BY id OPEN cur FETCH NEXT FROM cur INTO @id, @descr WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO #mytemptable( id, descr) VALUES(@id, @descr) FETCH NEXT FROM cur INTO @id, @descr END CLOSE cur DEALLOCATE cur; |
||||
20 май 14, 16:47 [16043744] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Откуда вы тогда знаете, что происходит на сервере при выполнении вашего кода ? |
||
20 май 14, 16:47 [16043745] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
Синтаксис Вам доступен? |
||||
20 май 14, 16:49 [16043759] Ответить | Цитировать Сообщить модератору |
адо Member Откуда: Сообщений: 24 |
Делаю косвенные выводы по получаемым результатам. |
||||
20 май 14, 16:56 [16043803] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
|
||||
20 май 14, 16:58 [16043823] Ответить | Цитировать Сообщить модератору |
адо Member Откуда: Сообщений: 24 |
Пардон, не оттуда скопировал. Ну, в общем, добавил STATIC в декларацию курсора. На результат не повлияло. |
||
20 май 14, 16:58 [16043827] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Ааа. Типа дедуктивный метод Шерлока Холмса ? И вы получили вывод, что курсор именно пропускает строки ? |
||||
20 май 14, 17:00 [16043842] Ответить | Цитировать Сообщить модератору |
адо Member Откуда: Сообщений: 24 |
Предполагаете, что где-то в недрах ODBC-драйвера код может волшебным образом поменяться? |
||||
20 май 14, 17:01 [16043848] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Ваша тезка ADO такая затейница. Так и непонятно, как же вы обрабатываете ошибки ? И тетстировали ли вы ваш скрипт просто в SMS ? |
||
20 май 14, 17:04 [16043864] Ответить | Цитировать Сообщить модератору |
адо Member Откуда: Сообщений: 24 |
Не пропускает, скорее вылетает из цикла раньше, чем должен. Вот пытаюсь выяснить, почему, и как это вообще понять отлаживая через замочную скважину. |
||||
20 май 14, 17:07 [16043887] Ответить | Цитировать Сообщить модератору |
адо Member Откуда: Сообщений: 24 |
Ну как обрабатываю, обыкновенно. Коннектор возвращает ошибку -- я о ней сообщаю. В данном случае -- не возвращает.
Говорю же, нет такой возможности. На реально базе, по крайней мере. А на нереальной ошибка не воспроизводится. |
||||
20 май 14, 17:13 [16043932] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Круто
Это как ? Чем ваши приложение отличается от SMS или sqlcmd или Access или Excel ? |
||||
20 май 14, 17:19 [16043984] Ответить | Цитировать Сообщить модератору |
адо Member Откуда: Сообщений: 24 |
Тем, что к этому приложению у меня есть доступ на сервере заказчика, а к другим нет. |
||
20 май 14, 17:23 [16044021] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Обратитесь к администратору, за получением доступа. Обратитесь к администратору, за получением бэкапа базы. |
||
20 май 14, 17:25 [16044044] Ответить | Цитировать Сообщить модератору |
адо Member Откуда: Сообщений: 24 |
Ни то, ни другое невозможно из-за параноидальной политики безопасности. |
||||
20 май 14, 17:26 [16044055] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |