Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / drop table не отрабатывает... / 20 сообщений из 20, страница 1 из 1
05.03.2018, 10:38
    #39610489
AlexanP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
Хотел написать так:

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 не отрабатывает ?
...
Рейтинг: 0 / 0
05.03.2018, 10:59
    #39610506
AlexanP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
Оказывается есть ограничение:

DROP TABLE and CREATE TABLE should not be executed on the same table in the same batch
...
Рейтинг: 0 / 0
05.03.2018, 11:27
    #39610528
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
create table #T (ID int)
go
drop table #T
go
create table #T (ID int, A char(10))
go
drop table #T
go
...
Рейтинг: 0 / 0
05.03.2018, 12:40
    #39610578
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
AlexanPОказывается есть ограничение:

DROP TABLE and CREATE TABLE should not be executed on the same table in the same batchСтранно, откуда это? Можно в одном батче, проверяется же за секунду.
...
Рейтинг: 0 / 0
05.03.2018, 12:49
    #39610586
ryli
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
https://docs.microsoft.com/ru-ru/sql/t-sql/language-elements/sql-server-utilities-statements-go

GO обозначает конец пакета Transact-SQL инструкции
...
Рейтинг: 0 / 0
05.03.2018, 12:55
    #39610589
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
Читаем справку и не гадаем.

CREATE TABLE ...
Если в пределах одной хранимой процедуры или пакета создается более одной временной таблицы, им должны быть присвоены разные имена.
...
Рейтинг: 0 / 0
05.03.2018, 12:59
    #39610592
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
alexeyvgAlexanPОказывается есть ограничение:

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 парсит создание/объявление временныех объекты/переменных в первую очередь, и для него нет дропа после создания
...
Рейтинг: 0 / 0
05.03.2018, 13:04
    #39610596
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
TaPaKalexeyvgпропущено...
Странно, откуда это? Можно в одном батче, проверяется же за секунду.
для временных нет.Ээээ, как это?
Конечно, можно создать таблицу, а потом её удалить в одном батче.
Код: sql
1.
2.
create table #t(id int)
drop table #t
...
Рейтинг: 0 / 0
05.03.2018, 13:04
    #39610597
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
alexeyvgTaPaKпропущено...

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


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

речь про
Код: sql
1.
2.
3.
create table #t(id int)
drop table #t
create table #t(id int)
...
Рейтинг: 0 / 0
05.03.2018, 13:12
    #39610601
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
TaPaKalexeyvgпропущено...
Ээээ, как это?
Конечно, можно создать таблицу, а потом её удалить в одном батче.
Код: sql
1.
2.
create table #t(id int)
drop table #t



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

речь про
Код: sql
1.
2.
3.
create table #t(id int)
drop table #t
create table #t(id int)

Я не про тему, я про конкретно фразу (откуда то), которая меня удивила:

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

DROP TABLE and CREATE TABLE should not be executed on the same table in the same batchСтранно, откуда это? Можно в одном батче, проверяется же за секунду.
...
Рейтинг: 0 / 0
05.03.2018, 13:13
    #39610602
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
Код: sql
1.
2.
3.
4.
5.
6.
create table #T (ID int)
if @a = 1
drop table #T

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



Что делать в этом случае? Ограничение вполне закономерное.
...
Рейтинг: 0 / 0
05.03.2018, 13:17
    #39610605
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
alexeyvg,

Код: sql
1.
DROP TABLE and CREATE TABLE


ну сделайте DROP и CREATE, а не как вы пишите CREATE и DROP ^)
...
Рейтинг: 0 / 0
05.03.2018, 13:21
    #39610607
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
Владислав Колосов
Код: sql
1.
2.
3.
4.
5.
6.
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 для компилятора есть декларирование таблицы в батче, и она будет видима им даже до её реального создания (и, само собой, после её удаления), например, так:

Код: sql
1.
2.
3.
4.
5.
6.
if 1=0 
	select * from #t
create table #t(id int)
drop table #t
if 1=0 
	select * from #t



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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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 -- и тут тоже???
...
Рейтинг: 0 / 0
05.03.2018, 13:24
    #39610609
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
TaPaKalexeyvg,

Код: sql
1.
DROP TABLE and CREATE TABLE



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

В той смутившей меня фразе не видно указание на последовательность, может, фраза вырвана из контекста?
Там просто написано, что эти 2 стейтмента не должны писаться в одном батче.
...
Рейтинг: 0 / 0
05.03.2018, 13:35
    #39610620
AlexanP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
Фраза из документации


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 нельзя выполнять для одной таблицы в одном пакете. В противном случае может произойти непредвиденная ошибка.
...
Рейтинг: 0 / 0
05.03.2018, 14:10
    #39610652
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
AlexanP,

это не требование, а здравая рекомендация.
...
Рейтинг: 0 / 0
05.03.2018, 14:54
    #39610689
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
AlexanPImportant
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 нельзя выполнять для одной таблицы в одном пакете. В противном случае может произойти непредвиденная ошибка.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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
...
Рейтинг: 0 / 0
05.03.2018, 14:59
    #39610694
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
Maxxне совсем верно :)Да; в общем, как простая инструкция для начинающих сойдёт, но в качестве исчерпывающего объяснения механизмов синтаксического анализатора батча, разрешения имён, правил видимости/существования временных таблиц выглядит бедно.

И даже как простая инструкция для начинающего выглядит некорректно, лучше бы написали "Инструкцию CREATE TABLE нельзя ставить после CREATE TABLE для одной таблицы в одном батче", что было бы неверно, как видно из вашего примера, но всё таки более корректно, чем сейчас.
...
Рейтинг: 0 / 0
05.03.2018, 15:01
    #39610695
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
alexeyvgлучше бы написали "Инструкцию CREATE TABLE нельзя ставить после CREATE TABLE для одной таблицы в одном батче"то есть "Инструкцию CREATE TABLE нельзя ставить после DROP TABLE для одной таблицы в одном батче"
...
Рейтинг: 0 / 0
05.03.2018, 15:02
    #39610696
Maxx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
drop table не отрабатывает...
alexeyvg,

сорри , но ето все описанно в хелпе,да и експеримент занимает 1 минуту написания кода. Если ТС реально интресно что и как- то направление движения ему выдали... далее нет ничего ценнее самообучения.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / drop table не отрабатывает... / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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