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

Откуда:
Сообщений: 5
Не пинайте сильно.

Досталась по наследству хранимая с курсорами, которая работала и предположительно перестала работать после удаление пользовательского типа табличных данных. Почему не понятно. В самой хранимой объявляется вроде стандартный курсор.
Хранимая выполняется без каких либо ошибок с сообщением "Выполнение команд успешно завершено."
Еще смущает отсутствие в перечне системный данных типа cursor (в SQL Server Magagement Studio в пункте "Прочие типы данных")
MS SQL Server 2008

Хранимая пробегается по полям range и av_range и превращает строки:
1,2,3,4-7
в
1,2,3,4,5,6,7
Записывает результат в таблицу process_rf_permit

а в таблице process_rf_permit_forter записывает разницу этих двух полей, например:
av_range = 1,2,3 (разрешенный перечень)
range = 1,3,4
результат = 1,3

+
USE [db_planning_group]
GO
/****** Object:  StoredProcedure [dbo].[process_rf_permit]    Script Date: 07/01/2016 11:30:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[process_rf_permit]
AS
BEGIN
	
	-- хранимая не работает
	-- записи с диапазонами каналов раскладывала на записи с конкретными значениями каналов
	-- скажем была запись с диапазоном 10-15, а стало 6 записей с каналами 10,11 и до 15
	
	truncate table nioss_rf_permit_processed;
	truncate table nioss_rf_permit_processed_forte;
	
	declare @counter int;

	declare
		@dat datetime
		,@region nvarchar(64)
		,@bts_site_id nvarchar(32)
		,@bts_name nvarchar(128)
		,@standart nvarchar(16)
		,@range_type nvarchar(1)
		,@range_name nvarchar(200)
		,@av_range nvarchar(200);

	declare
		 @prev_region nvarchar(64)
		,@prev_bts_site_id nvarchar(32)
		,@prev_bts_name nvarchar(128)
		,@prev_standart nvarchar(16)
		,@prev_range_type nvarchar(1)
		,@prev_range_name nvarchar(200)
		,@prev_av_range nvarchar(200);
		
	declare
		@diff nvarchar(max);

	declare 
		@num int

	declare cur cursor for
		select
			dat
			,nioss_rf_permit_current.region
			,bts_site_id
			,bts_name
			,nioss_rf_permit_current.standart
			,range_type
			,range_name
			,range av_range
		from
							nioss_rf_permit_current
			left outer join rf_available			on		nioss_rf_permit_current.REGION = rf_available.REGION
														and nioss_rf_permit_current.standart = rf_available.standart
		where
			doc_number is not null
		order by
			region
			,bts_name
			,standart
			,range_type

	open cur;

	fetch next from cur 
	into @dat
		,@prev_region
		,@prev_bts_site_id
		,@prev_bts_name
		,@prev_standart
		,@prev_range_type
		,@prev_range_name
		,@prev_av_range		
		;
	
	set @counter = 1;

	fetch next from cur 
	into @dat
		,@region
		,@bts_site_id
		,@bts_name
		,@standart
		,@range_type
		,@range_name
		,@av_range
		;

	set @counter = @counter + 1;

	while @@FETCH_STATUS = 0
	begin

		if @prev_bts_site_id=@bts_site_id and @prev_standart=@standart and @prev_range_type=@range_type begin
			set @prev_range_name = @prev_range_name + ',' + @range_name;
		end else begin

			if @prev_av_range is null begin
				set @diff = null
			end else begin
				set @diff = ''
			end

			declare cur_diff cursor for 
				select
					*
				from  
					iter_intlist_to_table(@prev_av_range)
				except
				select
					*
				from  
					iter_intlist_to_table(@prev_range_name)

			open cur_diff

			fetch next from cur_diff into @num;
			if @@FETCH_STATUS=0 begin
				set @diff = cast(@num as nvarchar);
				insert into nioss_rf_permit_processed_forte(
					dat
				   ,REGION
				   ,BTS_SITE_ID
				   ,BTS_NAME
				   ,STANDART
				   ,RANGE_TYPE
				   ,RANGE_NAME
				   ,channel
				) values (
					@dat
					,@prev_region
					,@prev_bts_site_id
					,@prev_bts_name
					,@prev_standart
					,@prev_range_type
					,@prev_range_name
					,@num
				)
				fetch next from cur_diff into @num;
			end

			while @@FETCH_STATUS=0 begin
				set @diff = @diff + ','+cast(@num as nvarchar);
				insert into nioss_rf_permit_processed_forte(
					dat
				   ,REGION
				   ,BTS_SITE_ID
				   ,BTS_NAME
				   ,STANDART
				   ,RANGE_TYPE
				   ,RANGE_NAME
				   ,channel
				) values (
					@dat
					,@prev_region
					,@prev_bts_site_id
					,@prev_bts_name
					,@prev_standart
					,@prev_range_type
					,@prev_range_name
					,@num
				)
				fetch next from cur_diff into @num;
			end

			close cur_diff;
			deallocate cur_diff;

			insert into nioss_rf_permit_processed (
				dat
			   ,REGION
			   ,BTS_SITE_ID
			   ,BTS_NAME
			   ,STANDART
			   ,RANGE_TYPE
			   ,RANGE_NAME
			   ,forbid_channels
			) values (
				@dat
				,@prev_region
				,@prev_bts_site_id
				,@prev_bts_name
				,@prev_standart
				,@prev_range_type
				,@prev_range_name
				,@diff
			);
			set @prev_region = @region
			set @prev_bts_site_id = @bts_site_id;
			set @prev_bts_name = @bts_name
			set @prev_standart = @standart;
			set @prev_range_name = @range_name;
			set @prev_range_type = @range_type;
			set @prev_av_range = @av_range;
		end

		set @counter = @counter + 1;

		fetch next from cur 
		into @dat
			,@region
			,@bts_site_id
			,@bts_name
			,@standart
			,@range_type
			,@range_name
			,@av_range;
	end

	if @prev_av_range is null begin
		set @diff = null
	end else begin
		set @diff = ''
	end

	declare cur_diff cursor for 
		select
			*
		from  
			iter_intlist_to_table(@prev_av_range)
		except
		select
			*
		from  
			iter_intlist_to_table(@prev_range_name)

	open cur_diff

	fetch next from cur_diff into @num;
	if @@FETCH_STATUS=0 begin
		set @diff = cast(@num as nvarchar);
		insert into nioss_rf_permit_processed_forte(
			dat
		   ,REGION
		   ,BTS_SITE_ID
		   ,BTS_NAME
		   ,STANDART
		   ,RANGE_TYPE
		   ,RANGE_NAME
		   ,channel
		) values (
			@dat
			,@prev_region
			,@prev_bts_site_id
			,@prev_bts_name
			,@prev_standart
			,@prev_range_type
			,@prev_range_name
			,@num
		)
		fetch next from cur_diff into @num;
	end

	while @@FETCH_STATUS=0 begin
		set @diff = @diff + ','+cast(@num as nvarchar);
		insert into nioss_rf_permit_processed_forte(
			dat
		   ,REGION
		   ,BTS_SITE_ID
		   ,BTS_NAME
		   ,STANDART
		   ,RANGE_TYPE
		   ,RANGE_NAME
		   ,channel
		) values (
			@dat
			,@prev_region
			,@prev_bts_site_id
			,@prev_bts_name
			,@prev_standart
			,@prev_range_type
			,@prev_range_name
			,@num
		)
		fetch next from cur_diff into @num;
	end
	close cur_diff;
	deallocate cur_diff;

	insert into nioss_rf_permit_processed (
		dat
	   ,REGION
	   ,BTS_SITE_ID
	   ,BTS_NAME
	   ,STANDART
	   ,RANGE_TYPE
	   ,RANGE_NAME
	   ,forbid_channels
	) values (
		@dat
		,@prev_region
		,@prev_bts_site_id
		,@prev_bts_name
		,@prev_standart
		,@prev_range_type
		,@prev_range_name
		,@diff
	);
	close cur;
	deallocate cur;
END


Сообщение было отредактировано: 4 июл 16, 11:00
4 июл 16, 09:46    [19365766]     Ответить | Цитировать Сообщить модератору
 Re: Не работает ХП с курсорами  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
cursor -- это не тип данных, и искать его надо в разделе declare cursor.
4 июл 16, 11:02    [19366032]     Ответить | Цитировать Сообщить модератору
 Re: Не работает ХП с курсорами  [new]
Konst_One
Member

Откуда:
Сообщений: 11625
declare cur_diff 2 раза
4 июл 16, 11:06    [19366049]     Ответить | Цитировать Сообщить модератору
 Re: Не работает ХП с курсорами  [new]
oreshnik
Member

Откуда:
Сообщений: 5
Konst_One
declare cur_diff 2 раза


Переименовал второй cur_diff. Безрезультатно.
4 июл 16, 12:58    [19366514]     Ответить | Цитировать Сообщить модератору
 Re: Не работает ХП с курсорами  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
oreshnik
Переименовал второй cur_diff. Безрезультатно.
Ну, поставьте отладочные выводы.

Что означает "перестала работать"?
Делает не то, вставляет не то, не вставляет строки?
Покажите скрипт вызова, включая проверку того, что "перестала работать".
Может, вы запускаете просто скрипт создания процедуры, и ждёте, что она выполнится? :-)
4 июл 16, 14:19    [19366907]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить