powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Избитая тема о существовании временных таблиц
6 сообщений из 6, страница 1 из 1
Избитая тема о существовании временных таблиц
    #32045024
Писатель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые мемберы и guest'ы!
Понадобилось мне как-то раз проверить существование временной таблицы, ну я, есессно, какой-то код для этого написал, а потом любопытство одолело, как же решают эту проблему участники данного форума. И пошел я в поиск. И был несколько озадачен его результатами.
Встречались такие варианты:
1.
Код: plaintext
if exists (SELECT * FROM tempdb..sysobjects WHERE name LIKE '#temptable%' AND xtype='U')

Понятно, что данное решение далеко от совершенства (даже более - оно совсем никуда не годится), потому что по LIKE может отфильтроваться далеко не одна таблица.
2.
Код: plaintext
if object_id('tempdb..#temptable') is not NULL

Замечательно работает, но также сработает и в том случае, когда существует временная процедура с заданным именем, так что тоже не панацея.
А в основном на данный вопрос ответ давался такой (типа универсальный и "самый правильный"):
Код: plaintext
1.
2.
3.
4.
IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id = Object_ID(N'tempdb..#temptable') 
AND ObjectProperty(id, N'IsUserTable') =  1 )
	print 'exists'
else
	print 'doesn''t exist'

Только вот непонятно мне, господа, как же это он у вас работает? Если его потестить, то он оказывается совершенно нежизнеспособным, ибо, как гласит BOL, функция ObjectProperty "Returns information about objects in the CURRENT database." (uppercased by me). В чем все и могут убедиться, прогнав простейший тестовый примерчик. Поэтому, если я правильно понимаю ситуацию, в проверке на существование временных таблиц ObjectProperty не пришей к звезде рукав получается, ибо данное условие никогда не выполнится.
Попинайте меня, если я не прав. Приношу извинения за возможный повтор, может быть, данная фича уже была кем-то отловлена, а я просто проглядел...

З.Ы. Для решения сабжа я использую следующий код:
Код: plaintext
IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id = object_id(N'tempdb..#temptable') AND type = 'U')
...
Рейтинг: 0 / 0
Избитая тема о существовании временных таблиц
    #32045072
Фотография snake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замечательно работает, но также сработает и в том случае, когда существует временная процедура с заданным именем, так что тоже не панацея.
Код: plaintext
1.
if object_id('tempdb..#temptable','U') is not NULL
...
Рейтинг: 0 / 0
Избитая тема о существовании временных таблиц
    #32045088
Писатель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2snake
Действительно, работает. Не знал, что у Object_ID может быть два параметра, "век живи - век учись" ©
Однако в процессе тестирования выяснилась следующая интересная весчь - одновременное существования временной таблицы и временной же процедуры с таким же именем чревато боком. Мудрый SQL Server в таком случае посредством функции Object_ID обращает внимание только на объект, созданный последним. В чем можно убедиться, прогнав нижеприведенный скриптик:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table #tmp (id int)
go
create procedure #tmp as select * from sysobjects
go

select object_id('tempdb..#tmp', 'P') as ProcID, object_id('tempdb..#tmp', 'U') as TabID

if exists (SELECT * FROM tempdb..sysobjects WHERE id = object_id(N'tempdb..#tmp') AND type = 'U')
	print 'table exists'
else
	print 'table doesn''t exist'
go

drop table #tmp
go
drop procedure #tmp
go
Так что, как говорится, вопрос пока остается открытым - как в ЛЮБОЙ ситуации однозначно определить сабж. Однако вопрос скорее академический, нежели чем практический, ибо вряд ли у кого-нибудь когда-либо возникнет вышеописанная ситуация.
...
Рейтинг: 0 / 0
Избитая тема о существовании временных таблиц
    #32045091
Фотография snake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очередная недоработка от MS...
...
Рейтинг: 0 / 0
Избитая тема о существовании временных таблиц
    #32045195
Фотография sparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замечание:
В реальном приложении, если интенсивно используются временные таблицы, такие проверки могут породить блокировки таблицы sysobjects и общее замедление работы сервера, поэтому в SELECTe рекомендую использвать хинт WITH (NOLOCK).
В часто используемых процедурах безусловно нельзя делать такие запросы.
...
Рейтинг: 0 / 0
Избитая тема о существовании временных таблиц
    #32045216
Rom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
опять-таки предлагаю делать через ХП. ХП завершилаь, временные таблицы удалились
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Избитая тема о существовании временных таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]