Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2014, 10:04   #11
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Проблему решил следующим образом, оказывается это баг SQL..

Код:
IF  OBJECT_ID('tempdb.dbo.#TempMenu') IS NOT NULL
		BEGIN
			DROP TABLE #TempMenu
		END

	SET IDENTITY_INSERT #TempMenu ON

	IF (@curPosition = '06')
		BEGIN
			INSERT INTO #TempMenu SELECT * FROM [USSD].[dbo].[Menu] WHERE [ShortNumber] = @shortNumber 
			AND [ParentId] = @curPosition 
			AND ([ReplyState] IS NULL OR [ReplyState] = @replyState) 
			AND ([ServiceId] IS NULL OR [ServiceId] IN (SELECT [ServiceId] FROM [CELL].[Subscriptions].[dbo].[Subscriptions] WITH (NOLOCK) WHERE [MSISDN] = @msisdn)) 
			ORDER BY [OrderId]
		END
	ELSE
		BEGIN
			INSERT INTO #TempMenu SELECT * FROM [USSD].[dbo].[Menu] WHERE [ShortNumber] = @shortNumber 
			AND [ParentId] = @curPosition 
			AND ([ReplyState] IS NULL OR [ReplyState] = @replyState) 
			ORDER BY [OrderId]
		END

	SET IDENTITY_INSERT #TempMenu OFF

Последний раз редактировалось coNsept; 24.11.2014 в 10:06.
coNsept вне форума Ответить с цитированием
Старый 24.11.2014, 10:24   #12
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

И это работает если #TempMenu не существует?
Допустим DROP TABLE #TempMenu не сработало и #TempMenu существует. Тогда отработает. Но добавив в #TempMenu к тому что было еще много чего. Но в начале сеанса #TempMenu нет. Тогда беда. #TempMenu создать нужно. SET IDENTITY_INSERT при чем? Оно используется для явной вставки автоинкрементных ключей. Если #TempMenu явно не создавалось, то их у него и в помине нет

Для проверки существования временной таблицы нужно по идее еще сервер указать
Код:
IF  OBJECT_ID('CELL.tempdb.dbo.#TempMenu') IS NOT NULL
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 24.11.2014 в 10:29.
Аватар вне форума Ответить с цитированием
Старый 24.11.2014, 15:11   #13
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Вообщем, сделал так и вроде как работает.
А на счет IF OBJECT_ID('tempdb.dbo.#TempMenu') IS NOT NULL удаляется и так.

Код:
	IF  OBJECT_ID('tempdb.dbo.#TempMenu') IS NOT NULL
		BEGIN
			DROP TABLE #TempMenu
		END

	SELECT * INTO #TempMenu FROM [USSD].[dbo].[Menu];

	TRUNCATE TABLE #TempMenu

SET IDENTITY_INSERT #TempMenu ON

	SET @curPosition = (SELECT TOP 1 [LastParentId] FROM [USSD].[dbo].[Sessions] WHERE [Msisdn] = @msisdn ORDER BY [Id] DESC);

	IF (@curPosition = '06')
		BEGIN
			SET @serviceId = (SELECT TOP 1 [ServiceId] FROM [USSD].[dbo].[Menu] WHERE [ParentId] = @curPosition + @nextPosition AND [ServiceId] IS NOT NULL);
			
		 /* Check if path exists for movement */
			IF EXISTS(SELECT * FROM [USSD].[dbo].[Menu] WHERE [ParentId] = @curPosition + @nextPosition)
				BEGIN
					IF (@serviceId IS NOT NULL)
						BEGIN
							EXEC [CELL].[Subscriptions].[dbo].[sp_ActivateSubscription] @msisdn, @serviceId, 'unsubscribe', @replyState OUT;					
						END

					/* Change subscriber position to new location */
					UPDATE [USSD].[dbo].[Sessions] SET [LastParentId] = @curPosition + @nextPosition WHERE [Msisdn] = @msisdn AND [Id] IN (SELECT TOP 1 [Id] FROM [USSD].[dbo].[Sessions] WHERE [Msisdn] = @msisdn ORDER BY [Id] DESC);	
				END
			ELSE 
				BEGIN
					/* Change subscriber position to default location */
					UPDATE [USSD].[dbo].[Sessions] SET [LastParentId] = '06' WHERE [Msisdn] = @msisdn AND [Id] IN (SELECT TOP 1 [Id] FROM [USSD].[dbo].[Sessions] WHERE [Msisdn] = @msisdn ORDER BY [Id] DESC);
				END

			INSERT INTO #TempMenu ([Id], [ShortNumber], [ServiceId], [ParentId], [ChildId], [KeyCode], [OrderId], [ReplyState], [NotifyMessage]) SELECT * FROM [USSD].[dbo].[Menu] WHERE [ShortNumber] = @shortNumber AND [ParentId] = @curPosition AND ([ReplyState] IS NULL OR [ReplyState] = @replyState) AND ([ServiceId] IS NULL OR [ServiceId] IN (SELECT [ServiceId] FROM [CELL].[Subscriptions].[dbo].[Subscriptions] WITH (NOLOCK) WHERE [MSISDN] = @msisdn)) ORDER BY [OrderId];
		END
	ELSE
		BEGIN
			INSERT INTO #TempMenu ([Id], [ShortNumber], [ServiceId], [ParentId], [ChildId], [KeyCode], [OrderId], [ReplyState], [NotifyMessage]) SELECT * FROM [USSD].[dbo].[Menu] WHERE [ShortNumber] = @shortNumber AND [ParentId] = @curPosition AND ([ReplyState] IS NULL OR [ReplyState] = @replyState) ORDER BY [OrderId];
		END

	SET IDENTITY_INSERT #TempMenu OFF
coNsept вне форума Ответить с цитированием
Старый 24.11.2014, 15:30   #14
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
SELECT * INTO #TempMenu FROM [USSD].[dbo].[Menu];

TRUNCATE TABLE #TempMenu
Скорость нужна? Зачем все записи из Menu тянуть во вр.таблицу, а затем еще и удалять их? Поставьте в WHERE SELECT-а заведомо не выполнимое условие, желательно по ключу таблицы. Создастся пустой вр.файл нужной структуры, из которого ни чего не нужно удалять.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 24.11.2014 в 15:34.
Аватар вне форума Ответить с цитированием
Старый 24.11.2014, 16:30   #15
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Спасибо, я чет не додумался, я с SQL пока не ахти.
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
switch и case C++ countteran Общие вопросы C/C++ 18 06.04.2013 20:52
Перемещение из case 1 в case 2(switch(), язык Си) Павел_95 Помощь студентам 13 11.01.2013 14:18
C++ switch case frozen__11 Общие вопросы C/C++ 6 11.11.2012 23:16
switch и case symrak Общие вопросы C/C++ 2 24.01.2012 15:17