Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как верно записать конструкцию ?  [new]
Потерянный пассажир
Guest
create table #t( a int )
IF OBJECT_ID(tempdb..#t) IS NOT NULL DROP TABLE #t
create table #t( a int )


автор
Msg 2714, Level 16, State 1, Line 3
There is already an object named '#t' in the database.
7 авг 15, 12:21    [17988310]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
IF OBJECT_ID(N'tempdb..#t','U') IS NOT NULL DROP TABLE #t
7 авг 15, 12:23    [17988329]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
зачем 2 раза create?
7 авг 15, 12:24    [17988336]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
Потерянный пассажир
Guest
Запросы с разных пакетов, но используют похожие таблицы. Вопрос даже не в этом, почему оно считает его ошибкой ?
7 авг 15, 12:28    [17988381]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Konst_One
зачем 2 раза create?
Хочет, небось, второй раз с тем же именем таблицу с другой структурой создать.
Кстати, как я написал, работать не будет.
Проверка на существование таблицы, если она создавалась в этой же области видимости, выглядит довольно-таки глупо.
7 авг 15, 12:29    [17988386]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
Потерянный пассажир
Guest
2iap - то же самое.
7 авг 15, 12:30    [17988403]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
если с этим же именем, но другой структуры, то нужно ALTER
7 авг 15, 12:32    [17988416]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
Потерянный пассажир
Guest
Так чего он ее не удаляет то ? Или она внутри транзакции еще не существует ?
7 авг 15, 12:33    [17988425]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Потерянный пассажир
2iap - то же самое.
Нельзя создавать таблицу в той же области видимости дважды -
сервер как бы продолжает "видеть" старую, хотя после DROP ничего с ней делать не разрешит. Известная фишка.
Для постоянных таблиц спасает EXECUTE().
А для временных - сами понимаете...
7 авг 15, 12:34    [17988426]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
Потерянный пассажир
Guest
2iap - ага понятно.
7 авг 15, 12:37    [17988455]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
o-o
Guest
Потерянный пассажир
Запросы с разных пакетов, но используют похожие таблицы. Вопрос даже не в этом, почему оно считает его ошибкой ?

как раз в разных пакетах работает:
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t
create table #t( a int )
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t
go
create table #t( a int )
7 авг 15, 12:57    [17988589]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
o-o
Потерянный пассажир
Запросы с разных пакетов, но используют похожие таблицы. Вопрос даже не в этом, почему оно считает его ошибкой ?

как раз в разных пакетах работает:
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t
create table #t( a int )
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t
go
create table #t( a int )
И куда же эту GO писать посоветуете?
Если её понимают только Management Studio и sqlcmd
7 авг 15, 13:01    [17988622]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
Это поведение описано в справке.
В разных пакетах можно описывать создание временной таблицы, но с только одинаковой структурой.
7 авг 15, 13:04    [17988647]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Владислав Колосов
Это поведение описано в справке.
В разных пакетах можно описывать создание временной таблицы, но с только одинаковой структурой.
А в данном случае структура разная?
7 авг 15, 13:09    [17988668]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
o-o
Guest
iap
o-o
пропущено...

как раз в разных пакетах работает:
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t
create table #t( a int )
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t
go
create table #t( a int )
И куда же эту GO писать посоветуете?
Если её понимают только Management Studio и sqlcmd

вы сказали, у вас CREATE-ы в разных пакетах, и не работает.
это не соответствует действительностиь, тк именно в разных пакетах и работает.
и то, что вам написали про EXEC,
это как раз и есть "выполнение в другом пакете".
а в студии да, пакеты разделяются тем самым GO.
и какой совет вы от меня хотите, если не описали вашу задачу,
а то, что описали, совсем не то, что вы делаете?
7 авг 15, 14:54    [17989443]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
o-o
iap
пропущено...
И куда же эту GO писать посоветуете?
Если её понимают только Management Studio и sqlcmd

вы сказали, у вас CREATE-ы в разных пакетах, и не работает.
это не соответствует действительностиь, тк именно в разных пакетах и работает.
и то, что вам написали про EXEC,
это как раз и есть "выполнение в другом пакете".
а в студии да, пакеты разделяются тем самым GO.
и какой совет вы от меня хотите, если не описали вашу задачу,
а то, что описали, совсем не то, что вы делаете?
Мне совет, в общем-то, не нужен, однако.
Если создать временную таблицу в динамическом запросе, то там она и помрёт.
Снаружи не появится, хоть и "разные пакеты".
GO - да, поможет. Но только в клиентских приложениях,
которые обрабатывают этот разделитель.
Если, например, надо это всё проделать в процедуре, то не взлетит.
7 авг 15, 15:01    [17989507]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
o-o
Guest
iap
Мне совет, в общем-то, не нужен, однако.

ок, ошибочка вышла, извиняюсь,
но чего же тогда ВЫ вместо ТС отвечаете?
он написал, что В РАЗНЫХ ПАКЕТАХ,
значит, организовался.
может, именно в студии и выполняет.

ну а раз уж вы влезли с "куда посоветуете"
то вам и отвечаю: давайте задачу целиком, тогда и посоветую.
7 авг 15, 15:15    [17989630]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
Потерянный пассажир
Guest
На самом деле все было просто :)
Было несколько хранимых процедур, которые "заливали" данные в одну таблицу. Решил особо не пудрить себе мозги
(согласовывать набор полей и все такое) просто сделать одно большую, но не тут то было.
Пришлось привести все к нормальному виду, что по сути хорошо :)

Вопрос был из разряда, почему, а не как можно решить :). Собственно ответ я получил :).
8 авг 15, 13:33    [17992846]     Ответить | Цитировать Сообщить модератору
 Re: Как верно записать конструкцию ?  [new]
o-o
Guest
Потерянный пассажир
Вопрос был из разряда, почему, а не как можно решить :). Собственно ответ я получил :).

вот это?
iap
Нельзя создавать таблицу в той же области видимости дважды -
сервер как бы продолжает "видеть" старую, хотя после DROP ничего с ней делать не разрешит. Известная фишка.
Для постоянных таблиц спасает EXECUTE().
А для временных - сами понимаете...

а вы не пробовали проделать то же самое для постоянной таблицы?
заметили, что вот такoе выполняется без проблем?
if OBJECT_ID('dbo.t') is not null drop table dbo.t;
create table dbo.t(id int);

if OBJECT_ID('dbo.t') is not null drop table dbo.t;
create table dbo.t(id int);

выходит, постоянные таблицы как минимум "спасать через EXECUTE()" не надо.
но пойдем дальше.
думаете, "сервер как бы продолжает видеть"?
а может, до выполнения просто не доходит и то, что вы получаете, это ошибка парсера?
попробуйте нажать в студии не EXECUTE, а PARSE(синяя галочка), и вывалится эта ошибка.
а для постоянных нет.

в общем, это такое ограничение для темповых таблиц и оно задокументировано
в соответствующей статье CREATE TABLE (Transact-SQL)
где много и других интересных подробностей в разделе Temporary Tables.
If more than one temporary table is created inside a single stored procedure or batch, they must have different names.
8 авг 15, 18:11    [17993379]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить