Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
vi0
Member

Откуда:
Сообщений: 296
все встречающиеся в сети примеры строятся с использованием drop, например

if object_id('#table1') is not null
drop table #table1

create table #table1 (a int)



Вопрос:
если я хозяин в своей базе, и знаю чего у меня где и скакой структурой, то почему не использовать вариант

if object_id('#table1') is null
create table #table1 (a int)
27 июл 13, 14:35    [14626394]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
=)8)
Guest
Если уверены, что таблица нужной структуры и пустая - никакой разницы.
27 июл 13, 15:07    [14626433]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31961
vi0
Вопрос:
если я хозяин в своей базе, и знаю чего у меня где и скакой структурой, то почему не использовать вариант
Так часто делают, если не нужно именно пересоздавать таблицу и удалять данные.

Временные таблицы - дело такое, вдруг какой то код создаст таблицу с таким же именем?
Вдруг программист, через три программиста после вас, не разберётся в вашем коде и вставит создание таблицы #table1 для каких то своих целей?
Это просто пример общепринятого хорошего кода - либо делать создание таблицы без проверки (если речь о хранимой процедуре), либо удалять/созавать.
27 июл 13, 15:13    [14626443]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
vi0
Вопрос:
если я хозяин в своей базе, и знаю чего у меня где и скакой структурой, то почему не использовать вариант

if object_id('#table1') is null
create table #table1 (a int)


Если это код в хп, то можно просто ограничиться:

create table #table1 (a int)
27 июл 13, 17:22    [14626728]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
1zy
Guest
vi0,

в этих же примерах скорее всего в конце стоит такой же дроп всего созданного.
это не стиль оформления кода, это стиль оформления чего-то тестового, демонстрационного, примерного
суть, грубо говоря, в чистоте эксперимента.

"какая-то там одноименная табличка с непонятно чем на момент запуска" в таких примерах чаще всего не нужна. т.е. если вдруг там "неподходящий для примера мусор", то пример/тест уже не прокатит или покажет лажу.
а если код, например, отладочный и нужно чтобы на момент запуска взялось то что внутри уже лежит - соответственно, ровно по смыслу - не дропать.

в хранимках дропать не рекомендуется, т.к. в этом случае если запуск одной хранимки из другой, то дропнуться может не мусор, а одноименная табличка из внешней хранимки. а это уже нехорошо. поэтому тут корректнее упасть с ошибкой про существование одноименного объекта.
27 июл 13, 19:01    [14626918]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
igr_ok
Member

Откуда:
Сообщений: 170
vi0
все встречающиеся в сети примеры строятся с использованием drop, например

if object_id('#table1') is not null
drop table #table1

create table #table1 (a int)



Вопрос:
если я хозяин в своей базе, и знаю чего у меня где и скакой структурой, то почему не использовать вариант

if object_id('#table1') is null
create table #table1 (a int)
Если проверять скрипт в SSMS, то после первого запуска временная таблица будет создана и она будет существовать до тех пор, пока не будет разорвано соединение. Следующий запрос уже вернет сообщение об ошибке, что такая таблица существует, поэтому и ставят дополнительную проверку. В хранимке эта проверка не нужна, там таблица удаляется после того,как хранимка отработает. Но и вреда от проверки нет. Что касается вашего предложения
if object_id('#table1') is null
create table #table1 (a int)

то здесь нет обработки для существующей таблицы. Зачем писать лишнее,если можно старую просто убить?
27 июл 13, 22:38    [14627410]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31961
igr_ok
В хранимке эта проверка не нужна, там таблица удаляется после того,как хранимка отработает.
Больше того, внешняя таблица с тем же именем тоже будет существовать! То есть в одном коннекте будет 2 временных таблицы с одинаковым именем!

igr_ok
Но и вреда от проверки нет.
Ну нет, вред есть.
Тут всё зависит от требований. Получается, есть три варианта:

1. Если временная таблица создаётся в хранимой процедуре для внутренних целей, нужно просто писать create table без каких либо условий. Тогда временная таблица будет локальной в процедуре, наружу (и обратно) влияния не будет.

2. Если мы хотим намеренно использовать внешнюю таблицу в том случае, если она есть, то нужно писать create table с проверкой.

3. Делать drop table с проверкой в процедуре нельзя никогда, поскольку внешняя таблица будет удалена, и будет просто ошибка выполнения.

Вот, можно поэкспериментировать:
use tempdb
go

create proc p
as
--if object_id('tempdb..#t') is not null
--drop table #t
--if object_id('tempdb..#t') is null
create table #t(A int)
select * from #t
go

exec p
create table #t(B int)
exec p
select * from #t
drop table #t
exec p
go

drop proc p
28 июл 13, 01:44    [14627872]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
vi0
Member

Откуда:
Сообщений: 296
igr_ok
Что касается вашего предложения
if object_id('#table1') is null
create table #table1 (a int)

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


"писать лишнее" это что?
28 июл 13, 13:41    [14628609]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
vi0
Member

Откуда:
Сообщений: 296
решил поэкспериментировать на тему удаления и создания таблиц в процедурах
ошибок не возникало
внешние таблицы сохранялись
как вызвать ошибку при удалении таблицы в процедуре?

if object_id('tempdb..#t') is not null drop table #t
if object_id('proc1') is not null drop proc proc1
if object_id('proc2') is not null drop proc proc2
go


create procedure proc1
as
create table #t (a int)
print object_id('tempdb..#t') -- 274100017
if object_id('tempdb..#t') is not null drop table #t
go


create procedure proc2
as
create table #t (a int)
exec proc1
print object_id('tempdb..#t') -- 258099960
go


create table #t (a int)
print object_id('tempdb..#t') -- 242099903

exec proc2

print object_id('tempdb..#t') -- 242099903
28 июл 13, 14:14    [14628704]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
vi0
Member

Откуда:
Сообщений: 296
вывод сделал такой:

если в процедуре обращения к временной таблице (drop, select,..) предваряются созданием таблицы, то эти обращения относятся к этой локальной таблице процедуры, иначе к внешней
28 июл 13, 14:34    [14628739]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
aleks2
Guest
create procedure proc1
as
if object_id('tempdb..#t') is not null drop table #t
create table #t (a int)

insert #t values(-1)
go


create procedure proc2
as
create table #t (a int)
insert #t values(1)
exec proc1
insert #t values(2)
go

exec proc2
28 июл 13, 14:35    [14628744]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
vi0
все встречающиеся в сети примеры строятся с использованием drop, например

if object_id('#table1') is not null
drop table #table1

create table #table1 (a int)



Вопрос:
если я хозяин в своей базе, и знаю чего у меня где и скакой структурой, то почему не использовать вариант

if object_id('#table1') is null
create table #table1 (a int)
Что-то никто не говорит, что данная проверка некорректна.
Надо так:
if object_id('tempdb..#table1') is null
28 июл 13, 15:50    [14628859]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31961
iap
Что-то никто не говорит, что данная проверка некорректна.
Надо так:
if object_id('tempdb..#table1') is null
Я уже написал, но не успел запостить - проверка показала, что корректна :-)

По крайней мере, в 2008 R2
Видимо, сделали такое поведение по многочисленным просьбам :-)


vi0
как вызвать ошибку при удалении таблицы в процедуре?
Раскомментарьте соответствующую строку в моём примере выше:

use tempdb
go

create proc p
as
if object_id('tempdb..#t') is not null
drop table #t
create table #t(A int)
select * from #t
go

exec p
create table #t(B int)
exec p
select * from #t
drop table #t
exec p
go

drop proc p


А ваш пример совсем не в тему - вы делаете drop table #t в конце процедуры, а вначале процедуры создаёте таблицу без каких либо проверок.

Это совсем не в тему пример, там делать проверку бессмысленно - будет всегда удаляться локальная версия таблицы, и её не может не быть, так что проверять то и нечего.
28 июл 13, 17:42    [14629020]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
vi0
Member

Откуда:
Сообщений: 296
alexeyvg
А ваш пример совсем не в тему - вы делаете drop table #t в конце процедуры, а вначале процедуры создаёте таблицу без каких либо проверок.

Это совсем не в тему пример, там делать проверку бессмысленно - будет всегда удаляться локальная версия таблицы, и её не может не быть, так что проверять то и нечего.

да, я уже понял, что мой пример не в тему совсем
я выше эти выводы написал, и там из выводов можно понять, что совсем не в тему пример мой
28 июл 13, 18:32    [14629097]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
vi0
Member

Откуда:
Сообщений: 296
alexeyvg
iap
Что-то никто не говорит, что данная проверка некорректна.
Надо так:
if object_id('tempdb..#table1') is null
Я уже написал, но не успел запостить - проверка показала, что корректна


если текущая база tempdb то можно не писать
http://msdn.microsoft.com/ru-ru/library/ms190328(v=sql.90).aspx
28 июл 13, 22:59    [14629665]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31961
vi0
alexeyvg
пропущено...
Я уже написал, но не успел запостить - проверка показала, что корректна


если текущая база tempdb то можно не писать
А, действительно, у меня же текущая база была tempdb, не заметил.

Конечно, текущую базу не надо писать в имени объекта...

Так что да, нужно писать для временных таблиц имя с tempdb.
29 июл 13, 09:56    [14630497]     Ответить | Цитировать Сообщить модератору
 Re: для чего выполнять DROP, когда можно не создавать объект если уже он есть  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
alexeyvg
А, действительно, у меня же текущая база была tempdb, не заметил
Настройте SSMSBoost/Preffered Connection/{your_server\TempDB}/StatusBarConnectionColor=Green - забывать перестанете
29 июл 13, 10:38    [14630735]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить