Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Цикл по курсору обходит не все строки  [new]
адо
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]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
адо
. Получается, что цикл по курсору не обходит все строки, а вылетает где-то раньше времени по непонятной причине

А как число записей в таблице #mytemptable показывает число итераций цикла WHILE ?
И как вы обрабытываете ошибки выполнения вашего кода ?
20 май 14, 16:16    [16043523]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
адо
Member

Откуда:
Сообщений: 24
Glory
А как число записей в таблице #mytemptable показывает число итераций цикла WHILE ?


А какие еще могут быть причины непопадания записей в эту таблицу?
20 май 14, 16:29    [16043610]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37143
адо
Glory
А как число записей в таблице #mytemptable показывает число итераций цикла WHILE ?


А какие еще могут быть причины непопадания записей в эту таблицу?
Ошибки в коде до упрощения.
20 май 14, 16:30    [16043618]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
адо,

а если попробовать объявить курсор статическим?
20 май 14, 16:33    [16043638]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
адо
Member

Откуда:
Сообщений: 24
Гавриленко Сергей Алексеевич
адо
пропущено...
А какие еще могут быть причины непопадания записей в эту таблицу?
Ошибки в коде до упрощения.


А какое они имеют значение? Проблема то фиксируется в уже упрощенном коде, в том, который приведен выше.
20 май 14, 16:33    [16043646]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
адо
Member

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

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


Попробовал. Нет, не помогает.
20 май 14, 16:38    [16043672]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
адо
Проблема то фиксируется в уже упрощенном коде, в том, который приведен выше.

И где же она фиксируется то ?
Вы трассировали число итераций в Профайлере, например ?
20 май 14, 16:39    [16043680]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
адо
iap
адо,

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


Попробовал. Нет, не помогает.
Что сделали? Текст покажите
20 май 14, 16:41    [16043692]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
адо
Member

Откуда:
Сообщений: 24
Glory
адо
Проблема то фиксируется в уже упрощенном коде, в том, который приведен выше.

И где же она фиксируется то ?
Вы трассировали число итераций в Профайлере, например ?


Нет. Ситуация осложняется тем, что доступа к инструментальным средствам MS-SQL нет, есть доступ только к клиентскому приложению. Так что я могу только исполнять запросы и выводить результаты.
20 май 14, 16:46    [16043723]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
адо
Member

Откуда:
Сообщений: 24
iap
адо
пропущено...
Попробовал. Нет, не помогает.
Что сделали? Текст покажите


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]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
адо
Ситуация осложняется тем, что доступа к инструментальным средствам MS-SQL нет, есть доступ только к клиентскому приложению.

Откуда вы тогда знаете, что происходит на сервере при выполнении вашего кода ?
20 май 14, 16:47    [16043745]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
адо
iap
пропущено...
Что сделали? Текст покажите


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?
Синтаксис Вам доступен?
20 май 14, 16:49    [16043759]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
адо
Member

Откуда:
Сообщений: 24
Glory
адо
Ситуация осложняется тем, что доступа к инструментальным средствам MS-SQL нет, есть доступ только к клиентскому приложению.

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


Делаю косвенные выводы по получаемым результатам.
20 май 14, 16:56    [16043803]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37143
адо
Glory
пропущено...

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


Делаю косвенные выводы по получаемым результатам.
Без трассы профайлера разговор ни о чем. Никто даже не знает, какой именно код выполняется на сервере, но результаты этого неизвестного кода почему-то считаются неправильными.
20 май 14, 16:58    [16043823]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
адо
Member

Откуда:
Сообщений: 24
iap
И где тут ключевое слово STATIC?
Синтаксис Вам доступен?

Пардон, не оттуда скопировал. Ну, в общем, добавил STATIC в декларацию курсора. На результат не повлияло.
20 май 14, 16:58    [16043827]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
адо
Glory
пропущено...

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


Делаю косвенные выводы по получаемым результатам.

Ааа. Типа дедуктивный метод Шерлока Холмса ?
И вы получили вывод, что курсор именно пропускает строки ?
20 май 14, 17:00    [16043842]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
адо
Member

Откуда:
Сообщений: 24
Гавриленко Сергей Алексеевич
адо
пропущено...
Делаю косвенные выводы по получаемым результатам.
Без трассы профайлера разговор ни о чем. Никто даже не знает, какой именно код выполняется на сервере, но результаты этого неизвестного кода почему-то считаются неправильными.

Предполагаете, что где-то в недрах ODBC-драйвера код может волшебным образом поменяться?
20 май 14, 17:01    [16043848]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
адо
Предполагаете, что где-то в недрах ODBC-драйвера код может волшебным образом поменяться?

Ваша тезка ADO такая затейница.
Так и непонятно, как же вы обрабатываете ошибки ?
И тетстировали ли вы ваш скрипт просто в SMS ?
20 май 14, 17:04    [16043864]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
адо
Member

Откуда:
Сообщений: 24
Glory
адо
пропущено...
Делаю косвенные выводы по получаемым результатам.

Ааа. Типа дедуктивный метод Шерлока Холмса ?
И вы получили вывод, что курсор именно пропускает строки ?


Не пропускает, скорее вылетает из цикла раньше, чем должен. Вот пытаюсь выяснить, почему, и как это вообще понять отлаживая через замочную скважину.
20 май 14, 17:07    [16043887]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
адо
Member

Откуда:
Сообщений: 24
Glory
Так и непонятно, как же вы обрабатываете ошибки ?

Ну как обрабатываю, обыкновенно. Коннектор возвращает ошибку -- я о ней сообщаю. В данном случае -- не возвращает.

Glory
И тетстировали ли вы ваш скрипт просто в SMS ?

Говорю же, нет такой возможности. На реально базе, по крайней мере. А на нереальной ошибка не воспроизводится.
20 май 14, 17:13    [16043932]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
адо
Ну как обрабатываю, обыкновенно. Коннектор возвращает ошибку -- я о ней сообщаю. В данном случае -- не возвращает.

Круто
адо
Говорю же, нет такой возможности. На реально базе, по крайней мере.

Это как ? Чем ваши приложение отличается от SMS или sqlcmd или Access или Excel ?
20 май 14, 17:19    [16043984]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
адо
Member

Откуда:
Сообщений: 24
Glory
Чем ваши приложение отличается от SMS или sqlcmd или Access или Excel ?

Тем, что к этому приложению у меня есть доступ на сервере заказчика, а к другим нет.
20 май 14, 17:23    [16044021]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
Glory
Member

Откуда:
Сообщений: 104760
адо
Тем, что к этому приложению у меня есть доступ на сервере заказчика, а к другим нет.

Обратитесь к администратору, за получением доступа.
Обратитесь к администратору, за получением бэкапа базы.
20 май 14, 17:25    [16044044]     Ответить | Цитировать Сообщить модератору
 Re: Цикл по курсору обходит не все строки  [new]
адо
Member

Откуда:
Сообщений: 24
Glory
адо
Тем, что к этому приложению у меня есть доступ на сервере заказчика, а к другим нет.

Обратитесь к администратору, за получением доступа.
Обратитесь к администратору, за получением бэкапа базы.

Ни то, ни другое невозможно из-за параноидальной политики безопасности.
20 май 14, 17:26    [16044055]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить