Проверка наличия временной таблицы в среде с несколькими временными базами данных?

#tsql #sybase #temp-tables

Вопрос:

Существует ли какой-либо способ определить, была ли создана определенная временная таблица в сеансе без ссылки на базу данных tempdb, в которой она была создана? Пользователи выделяются для определенной базы данных temp при входе в систему, поэтому я не знаю, какую базу данных temp они будут использовать.

Мне не нужно указывать базу данных tempdb, чтобы выбрать данные из временной таблицы, поэтому, конечно, я могу видеть, существует ли таблица?

Ответ №1:

Вы можете проверить наличие временного объекта, используя object_id:

 SELECT object_id('#tmpTable')
 

Вы можете указать, какую базу данных tempdb вы используете, если хотите, но вам это не нужно:

 SELECT object_id('tempdb..#tmpTable')
 

Стоит отметить, что это также работает и для глобальных временных таблиц:

 SELECT object_id('##tmpTable')
 

Чтобы сценарии можно было запускать повторно без необходимости в конце удалять ТАБЛИЦУ, я всегда проверяю и удаляю, прежде чем создавать временную таблицу. Я часто оставляю таблицы, созданные при разработке SQL-кода.

 IF NULLIF(object_id('#tmpTable'), 0) IS NOT NULL DROP TABLE #tmpTable
CREATE TABLE #tmpTable (
    id int,
    col1 varchar(100)
)
 

Ответ №2:

Мне кажется, что вам не следует использовать здесь временные таблицы… они больше похожи на обычные таблицы (возможно, с идентификатором пользователя). Каков здесь сценарий?

Обратите внимание, что использование временных таблиц таким образом может привести к разрушению кэша оптимизатора/запроса — ему придется выполнять множество перекомпиляций, так как значение #FOO довольно сильно меняется за один вызов.

Комментарии:

1. это сложный сценарий для объяснения, все это устаревшие приложения и сумасшедшие требования (вкл. не используя обычные таблицы). В принципе, мне нужно приложение для создания временной таблицы (с помощью execute immediate), а затем использовать хранимую процедуру для ее заполнения. Затем попросите приложение прочитать из таблицы. wtf.

2. В таком случае лучшее, что я могу предложить, — это попробовать ВЫБРАТЬ из таблицы и посмотреть, не вырвет ли ее! Извините…

3. спасибо, это то, чем я сейчас занимаюсь, но это кажется немного неэлегантным.