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

Откуда:
Сообщений: 154
Хотел написать так:

create table #T (ID int)
drop table #T

create table #T (ID int, A char(10))
drop table #T


Ругается, что
There is already an object named '#T' in the database.

А почему первый DROP не отрабатывает ?
5 мар 18, 10:38    [21237046]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
AlexanP
Member

Откуда:
Сообщений: 154
Оказывается есть ограничение:

DROP TABLE and CREATE TABLE should not be executed on the same table in the same batch
5 мар 18, 10:59    [21237115]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36905
create table #T (ID int)
go
drop table #T
go
create table #T (ID int, A char(10))
go
drop table #T
go
5 мар 18, 11:27    [21237192]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
AlexanP
Оказывается есть ограничение:

DROP TABLE and CREATE TABLE should not be executed on the same table in the same batch
Странно, откуда это? Можно в одном батче, проверяется же за секунду.
5 мар 18, 12:40    [21237430]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
ryli
Guest
https://docs.microsoft.com/ru-ru/sql/t-sql/language-elements/sql-server-utilities-statements-go

GO обозначает конец пакета Transact-SQL инструкции
5 мар 18, 12:49    [21237459]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7663
Читаем справку и не гадаем.

CREATE TABLE ...
Если в пределах одной хранимой процедуры или пакета создается более одной временной таблицы, им должны быть присвоены разные имена.
5 мар 18, 12:55    [21237474]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
alexeyvg
AlexanP
Оказывается есть ограничение:

DROP TABLE and CREATE TABLE should not be executed on the same table in the same batch
Странно, откуда это? Можно в одном батче, проверяется же за секунду.

для временных нет.

автор
If more than one temporary table is created inside a single stored procedure or batch, they must have different names.

если не ошибаюсь, DB ENGINE парсит создание/объявление временныех объекты/переменных в первую очередь, и для него нет дропа после создания
5 мар 18, 12:59    [21237483]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
TaPaK
alexeyvg
пропущено...
Странно, откуда это? Можно в одном батче, проверяется же за секунду.

для временных нет.
Ээээ, как это?
Конечно, можно создать таблицу, а потом её удалить в одном батче.
create table #t(id int)
drop table #t
5 мар 18, 13:04    [21237503]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
alexeyvg
TaPaK
пропущено...

для временных нет.
Ээээ, как это?
Конечно, можно создать таблицу, а потом её удалить в одном батче.
create table #t(id int)
drop table #t

не читайте тему, сразу отвечайте

речь про
create table #t(id int)
drop table #t
create table #t(id int)
5 мар 18, 13:04    [21237506]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
TaPaK
alexeyvg
пропущено...
Ээээ, как это?
Конечно, можно создать таблицу, а потом её удалить в одном батче.
create table #t(id int)
drop table #t


не читайте тему, сразу отвечайте

речь про
create table #t(id int)
drop table #t
create table #t(id int)
Я не про тему, я про конкретно фразу (откуда то), которая меня удивила:

alexeyvg
AlexanP
Оказывается есть ограничение:

DROP TABLE and CREATE TABLE should not be executed on the same table in the same batch
Странно, откуда это? Можно в одном батче, проверяется же за секунду.
5 мар 18, 13:12    [21237524]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7663
create table #T (ID int)
if @a = 1
drop table #T

create table #T (ID int, A char(10))
drop table #T


Что делать в этом случае? Ограничение вполне закономерное.
5 мар 18, 13:13    [21237527]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
alexeyvg,

DROP TABLE and CREATE TABLE

ну сделайте DROP и CREATE, а не как вы пишите CREATE и DROP ^)
5 мар 18, 13:17    [21237533]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
Владислав Колосов
create table #T (ID int)
if @a = 1
drop table #T

create table #T (ID int, A char(10))
drop table #T



Что делать в этом случае? Ограничение вполне закономерное.
Ничего, нужно просто не писать так.

Тут важно не смешивать 2 понятия - видимость идентификатора компилятором и создание/ удаление временной таблицы

create table #T для компилятора есть декларирование таблицы в батче, и она будет видима им даже до её реального создания (и, само собой, после её удаления), например, так:

if 1=0 
	select * from #t
create table #t(id int)
drop table #t
if 1=0 
	select * from #t


Соответственно, тогда становится понятно, почему нельзя в том же батче создать (декларировать для компилятора) таблицу второй раз.

if 1=0 
	select * from #t -- какая из таблиц имеется в виду???
create table #t(id int)
drop table #t
create table #t(id varchar)
drop table #t
if 1=0 
	select * from #t -- и тут тоже???
5 мар 18, 13:21    [21237548]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
TaPaK
alexeyvg,

DROP TABLE and CREATE TABLE


ну сделайте DROP и CREATE, а не как вы пишите CREATE и DROP ^)
Ну дык я же про это и пишу.

В той смутившей меня фразе не видно указание на последовательность, может, фраза вырвана из контекста?
Там просто написано, что эти 2 стейтмента не должны писаться в одном батче.
5 мар 18, 13:24    [21237557]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
AlexanP
Member

Откуда:
Сообщений: 154
Фраза из документации


https://msdn.microsoft.com/ru-ru/library/ms173790(v=sql.120)

DROP TABLE (Transact-SQL)

Important
DROP TABLE and CREATE TABLE should not be executed on the same table in the same batch. Otherwise an unexpected error may occur.

Важно!
Инструкции DROP TABLE и CREATE TABLE нельзя выполнять для одной таблицы в одном пакете. В противном случае может произойти непредвиденная ошибка.
5 мар 18, 13:35    [21237602]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
AlexanP,

это не требование, а здравая рекомендация.
5 мар 18, 14:10    [21237770]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
AlexanP
Important
DROP TABLE and CREATE TABLE should not be executed on the same table in the same batch. Otherwise an unexpected error may occur.

Важно!
Инструкции DROP TABLE и CREATE TABLE нельзя выполнять для одной таблицы в одном пакете. В противном случае может произойти непредвиденная ошибка.


не совсем верно :)

create procedure dbo.test_tmptales
as begin
  if object_id('tempdb..#test_from_prc', 'U') is not null
    drop table  #test_from_prc
    create table #test_from_prc (i int null)

    if object_id('tempdb..#test_from_prc', 'U') is not null
    drop table  #test_from_prc
end
GO
drop procedure dbo.test_tmptales
GO
5 мар 18, 14:54    [21237980]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
Maxx
не совсем верно :)
Да; в общем, как простая инструкция для начинающих сойдёт, но в качестве исчерпывающего объяснения механизмов синтаксического анализатора батча, разрешения имён, правил видимости/существования временных таблиц выглядит бедно.

И даже как простая инструкция для начинающего выглядит некорректно, лучше бы написали "Инструкцию CREATE TABLE нельзя ставить после CREATE TABLE для одной таблицы в одном батче", что было бы неверно, как видно из вашего примера, но всё таки более корректно, чем сейчас.
5 мар 18, 14:59    [21238011]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
alexeyvg
лучше бы написали "Инструкцию CREATE TABLE нельзя ставить после CREATE TABLE для одной таблицы в одном батче"
то есть "Инструкцию CREATE TABLE нельзя ставить после DROP TABLE для одной таблицы в одном батче"
5 мар 18, 15:01    [21238019]     Ответить | Цитировать Сообщить модератору
 Re: drop table не отрабатывает...  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
alexeyvg,

сорри , но ето все описанно в хелпе,да и експеримент занимает 1 минуту написания кода. Если ТС реально интресно что и как- то направление движения ему выдали... далее нет ничего ценнее самообучения.
5 мар 18, 15:02    [21238025]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить