Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать существует ли временная таблица (в MSSQLServer)? [D6, MSSQL]


alxx ©   (2002-11-29 15:55:00) 

Не хочется переключаться: use tempdb...


Владислав   (2002-11-30 10:24:00) [1]

> Delirium © (29.11.02 19:23)

Класс! Спасибо!


Delirium   (2002-11-29 19:23:00) [2]

Ну и по написали :)
if Object_ID("tempdb..#test") is not null
print "Есть временная таблица #test !"


Владислав   (2002-11-29 19:14:00) [3]

Кстати, я тут эксперементировал, так что правильно так:

IF EXISTS(SELECT id FROM tempdb..sysobjects WHERE id = object_id(N"tempdb..#MY_TEMP_TABLE"))
DROP TABLE #MY_TEMP_TABLE
CREATE TABLE #MY_TEMP_TABLE
(
ID INT
)

А первый вариант - последствие экспериментов :)


Владислав   (2002-11-29 19:13:00) [4]

Ага :)
Так что еще раз спасибо!


sniknik   (2002-11-29 19:02:00) [5]

ну ктото знает одно ктото другое, я то например знал эту "конструкцию" но не получалось все одно (но в общем то и не очень нужно было, вернее совсем не нужно но пытался).

а у тебя да правильно работает. как понадобится уже есть готовое решение.


Владислав   (2002-11-29 18:39:00) [6]

Я не вызываю этот блок. В нем явный глюк. Таблица не удаляется, а удаляются записи из нее, а потом опять создается таблица.

Я этим пользуюсь (например):

IF EXISTS(SELECT id FROM tempdb..sysobjects WHERE id = object_id(N"tempdb..#MY_TEMP_TABLE"))
DROP TABLE #MY_TEMP_TABLE
RETURN
CREATE TABLE #MY_TEMP_TABLE
(
ID INT
)


Проблема была в том, что я не знал этой конструкции: object_id(N"tempdb..#MY_TEMP_TABLE"). Поэтому и не мог определить, существует временная таблица, или нет.


sniknik   (2002-11-29 18:34:00) [7]

Владислав © (29.11.02 18:20)
попробуй вызвать блок от alxx © (29.11.02 17:51)
2 раза подряд, у меня он пытается еще раз создать ту же таблицу, т.е. не находит.


Владислав   (2002-11-29 18:20:00) [8]

> alxx © (29.11.02 17:51)

Классно! Спасибо за решение!

> asmith (29.11.02 17:52)

Это не вариант, к сожалению. Несколько пользователей могут запустить одно приложение, в котором используется временная таблица. В результате в sysobjects можно будет найти записи по предлагаемому условию, но это не означает, что таблица создана.


sniknik   (2002-11-29 18:02:00) [9]

alxx © (29.11.02 17:51)
хм.. а так у меня неполучалось...??? почему?


sniknik   (2002-11-29 17:59:00) [10]

да не прокатит, только она переключится неявным образом и при следуюшем создании временной таблици ранние удалит. :(

но выборку в некоторых случаях можно сделать, только по имени я так и не смог обратится только WHERE Name LIKE "#TableName%"


asmith   (2002-11-29 17:52:00) [11]

Прокатит, если искать по первым N символам имени таблицы, где N - длина имени при создании (сервер в sysobjects внесет измененное имя); если ее имя, например, #result (длина 7), то ищем так:
select * from tempdb..sysobjects where SUBSTRING(name, 1, 7) = "#result"


alxx   (2002-11-29 17:51:00) [12]

Прокатило:

IF not exists (select * from tempdb..sysobjects where id = object_id(N"tempdb..[#TS]") )
BEGIN
CREATE TABLE [dbo].#TS (
KodTv [int] NOT NULL,
Mest [real] NOT NULL,
Kolich [real] NOT NULL,
)
END ELSE DELETE FROM #TS


alxx   (2002-11-29 17:50:00) [13]

Спасибо! То что нужно. Я просто забыл как к другой БД запрос делать..


Владислав   (2002-11-29 17:45:00) [14]

Не прокатит.


sniknik   (2002-11-29 17:39:00) [15]

alxx © (29.11.02 15:55)
>Не хочется переключаться: use tempdb...

не переключайся прямо и делай запрос
select * from tempdb..sysobjects WHERE ....


alxx   (2002-11-29 17:17:00) [16]

Я обрабатываю Exception в ADOQuery, но хотелось бы чтобы Delphi не парила мозги каждый раз своими Break-ами. Сидеть с выключенным Break on Exception тоже не хочется (по некоторым причинам). Просто хотелось сделать правильно...
Ну да ладно. Пока так сойдет.


Владислав   (2002-11-29 17:11:00) [17]

В свое время не нашли хорошего решения (хотя может оно и существует), поэтому просто удаляли их - DROP TABLE #temp_table_name в ADOQuery и перехватывали ошибки.


Наверх

Титульная страница Поиск, карта сайта Написать письмо