Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Цикл по курсору обходит не все строки / 25 сообщений из 51, страница 1 из 3
20.05.2014, 16:07
    #38646650
адо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
Здравствуйте, коллеги.

Есть вот такой код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
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;



Код упрощен для отладки, так что на "физический смысл" не обращайте внимания.
Проблема вот в чем.
Запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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 записей, а запрос по результирующей таблице
Код: sql
1.
2.
SELECT *
FROM #mytemptable


возвращает примерно 160-170 записей (при каждом выполнении разное число!!!)
Причем это именно первые 160-170 записей из верхнего запроса. Получается, что цикл по курсору не обходит все строки, а вылетает где-то раньше времени по непонятной причине. Как такое вообще возможно и куда теперь копать?
...
Рейтинг: 0 / 0
20.05.2014, 16:16
    #38646667
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
адо. Получается, что цикл по курсору не обходит все строки, а вылетает где-то раньше времени по непонятной причине
А как число записей в таблице #mytemptable показывает число итераций цикла WHILE ?
И как вы обрабытываете ошибки выполнения вашего кода ?
...
Рейтинг: 0 / 0
20.05.2014, 16:29
    #38646682
адо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
GloryА как число записей в таблице #mytemptable показывает число итераций цикла WHILE ?


А какие еще могут быть причины непопадания записей в эту таблицу?
...
Рейтинг: 0 / 0
20.05.2014, 16:30
    #38646685
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
адоGloryА как число записей в таблице #mytemptable показывает число итераций цикла WHILE ?


А какие еще могут быть причины непопадания записей в эту таблицу?Ошибки в коде до упрощения.
...
Рейтинг: 0 / 0
20.05.2014, 16:33
    #38646691
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
адо,

а если попробовать объявить курсор статическим?
...
Рейтинг: 0 / 0
20.05.2014, 16:33
    #38646693
адо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
Гавриленко Сергей Алексеевичадопропущено...
А какие еще могут быть причины непопадания записей в эту таблицу?Ошибки в коде до упрощения.

А какое они имеют значение? Проблема то фиксируется в уже упрощенном коде, в том, который приведен выше.
...
Рейтинг: 0 / 0
20.05.2014, 16:38
    #38646698
адо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
iapадо,

а если попробовать объявить курсор статическим?

Попробовал. Нет, не помогает.
...
Рейтинг: 0 / 0
20.05.2014, 16:39
    #38646701
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
адоПроблема то фиксируется в уже упрощенном коде, в том, который приведен выше.
И где же она фиксируется то ?
Вы трассировали число итераций в Профайлере, например ?
...
Рейтинг: 0 / 0
20.05.2014, 16:41
    #38646703
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
адоiapадо,

а если попробовать объявить курсор статическим?

Попробовал. Нет, не помогает.Что сделали? Текст покажите
...
Рейтинг: 0 / 0
20.05.2014, 16:46
    #38646712
адо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
GloryадоПроблема то фиксируется в уже упрощенном коде, в том, который приведен выше.
И где же она фиксируется то ?
Вы трассировали число итераций в Профайлере, например ?

Нет. Ситуация осложняется тем, что доступа к инструментальным средствам MS-SQL нет, есть доступ только к клиентскому приложению. Так что я могу только исполнять запросы и выводить результаты.
...
Рейтинг: 0 / 0
20.05.2014, 16:47
    #38646720
адо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
iapадопропущено...
Попробовал. Нет, не помогает.Что сделали? Текст покажите

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
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;
...
Рейтинг: 0 / 0
20.05.2014, 16:47
    #38646721
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
адоСитуация осложняется тем, что доступа к инструментальным средствам MS-SQL нет, есть доступ только к клиентскому приложению.
Откуда вы тогда знаете, что происходит на сервере при выполнении вашего кода ?
...
Рейтинг: 0 / 0
20.05.2014, 16:49
    #38646725
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
адоiapпропущено...
Что сделали? Текст покажите

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
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;

И где тут ключевое слово STATIC?
Синтаксис Вам доступен?
...
Рейтинг: 0 / 0
20.05.2014, 16:56
    #38646734
адо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
GloryадоСитуация осложняется тем, что доступа к инструментальным средствам MS-SQL нет, есть доступ только к клиентскому приложению.
Откуда вы тогда знаете, что происходит на сервере при выполнении вашего кода ?

Делаю косвенные выводы по получаемым результатам.
...
Рейтинг: 0 / 0
20.05.2014, 16:58
    #38646738
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
адоGloryпропущено...

Откуда вы тогда знаете, что происходит на сервере при выполнении вашего кода ?

Делаю косвенные выводы по получаемым результатам.Без трассы профайлера разговор ни о чем. Никто даже не знает, какой именно код выполняется на сервере, но результаты этого неизвестного кода почему-то считаются неправильными.
...
Рейтинг: 0 / 0
20.05.2014, 16:58
    #38646740
адо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
iapИ где тут ключевое слово STATIC?
Синтаксис Вам доступен?
Пардон, не оттуда скопировал. Ну, в общем, добавил STATIC в декларацию курсора. На результат не повлияло.
...
Рейтинг: 0 / 0
20.05.2014, 17:00
    #38646744
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
адоGloryпропущено...

Откуда вы тогда знаете, что происходит на сервере при выполнении вашего кода ?

Делаю косвенные выводы по получаемым результатам.
Ааа. Типа дедуктивный метод Шерлока Холмса ?
И вы получили вывод, что курсор именно пропускает строки ?
...
Рейтинг: 0 / 0
20.05.2014, 17:01
    #38646747
адо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
Гавриленко Сергей Алексеевичадопропущено...
Делаю косвенные выводы по получаемым результатам.Без трассы профайлера разговор ни о чем. Никто даже не знает, какой именно код выполняется на сервере, но результаты этого неизвестного кода почему-то считаются неправильными.
Предполагаете, что где-то в недрах ODBC-драйвера код может волшебным образом поменяться?
...
Рейтинг: 0 / 0
20.05.2014, 17:04
    #38646752
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
адоПредполагаете, что где-то в недрах ODBC-драйвера код может волшебным образом поменяться?
Ваша тезка ADO такая затейница.
Так и непонятно, как же вы обрабатываете ошибки ?
И тетстировали ли вы ваш скрипт просто в SMS ?
...
Рейтинг: 0 / 0
20.05.2014, 17:07
    #38646761
адо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
Gloryадопропущено...
Делаю косвенные выводы по получаемым результатам.
Ааа. Типа дедуктивный метод Шерлока Холмса ?
И вы получили вывод, что курсор именно пропускает строки ?

Не пропускает, скорее вылетает из цикла раньше, чем должен. Вот пытаюсь выяснить, почему, и как это вообще понять отлаживая через замочную скважину.
...
Рейтинг: 0 / 0
20.05.2014, 17:13
    #38646770
адо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
GloryТак и непонятно, как же вы обрабатываете ошибки ?
Ну как обрабатываю, обыкновенно. Коннектор возвращает ошибку -- я о ней сообщаю. В данном случае -- не возвращает.

GloryИ тетстировали ли вы ваш скрипт просто в SMS ?
Говорю же, нет такой возможности. На реально базе, по крайней мере. А на нереальной ошибка не воспроизводится.
...
Рейтинг: 0 / 0
20.05.2014, 17:19
    #38646781
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
адоНу как обрабатываю, обыкновенно. Коннектор возвращает ошибку -- я о ней сообщаю. В данном случае -- не возвращает.
Круто
адоГоворю же, нет такой возможности. На реально базе, по крайней мере.
Это как ? Чем ваши приложение отличается от SMS или sqlcmd или Access или Excel ?
...
Рейтинг: 0 / 0
20.05.2014, 17:23
    #38646785
адо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
GloryЧем ваши приложение отличается от SMS или sqlcmd или Access или Excel ?
Тем, что к этому приложению у меня есть доступ на сервере заказчика, а к другим нет.
...
Рейтинг: 0 / 0
20.05.2014, 17:25
    #38646788
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
адоТем, что к этому приложению у меня есть доступ на сервере заказчика, а к другим нет.
Обратитесь к администратору, за получением доступа.
Обратитесь к администратору, за получением бэкапа базы.
...
Рейтинг: 0 / 0
20.05.2014, 17:26
    #38646790
адо
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл по курсору обходит не все строки
GloryадоТем, что к этому приложению у меня есть доступ на сервере заказчика, а к другим нет.
Обратитесь к администратору, за получением доступа.
Обратитесь к администратору, за получением бэкапа базы.
Ни то, ни другое невозможно из-за параноидальной политики безопасности.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Цикл по курсору обходит не все строки / 25 сообщений из 51, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]