![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать существует ли временная таблица (в 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 и перехватывали ошибки.