Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Удалить временную таблицу  [new]
akaGlory
Guest
Heart
автор
Ну дык - смотри выше ответ

эта ошибка возникает НЕ ТОЛЬКО при компиляции,НО И при выполнении.

Parse ВСЕГДА выполняется перед Execute.
17 янв 06, 16:50    [2262784]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
akaGlory
Guest
И если Parse происходит с ошибкой то Execute не начинается
17 янв 06, 16:52    [2262791]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
Heart
Member

Откуда:
Сообщений: 227
daw

2 Heart
дело не в том, что таблица не удаляется.
просто в одном батче нельзя написать два оператора по
созданию одной и той же таблицы.


Posted via ActualForum NNTP Server 1.3


автор
DECLARE @config INT
SET @config = 0

SELECT * INTO Temp FROM _db...DataDif WHERE Config=@config
...
DROP TABLE Temp;

SET @config = 1
SELECT * INTO Temp FROM _db...DataDif WHERE Config=@config
...

если я пишу вот так - все работает. Не работает именно со временными. А хотелось бы с ними.
17 янв 06, 16:52    [2262799]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
akaGlory
Guest
Heart
daw

2 Heart
дело не в том, что таблица не удаляется.
просто в одном батче нельзя написать два оператора по
созданию одной и той же таблицы.


Posted via ActualForum NNTP Server 1.3


автор
DECLARE @config INT
SET @config = 0

SELECT * INTO Temp FROM _db...DataDif WHERE Config=@config
...
DROP TABLE Temp;

SET @config = 1
SELECT * INTO Temp FROM _db...DataDif WHERE Config=@config
...

если я пишу вот так - все работает. Не работает именно со временными. А хотелось бы с ними.

Перечитайте уже ответы и поймите суть. Хватит тупить
17 янв 06, 16:54    [2262803]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
2 pasha701

Точка с запятой не есть разделитель бачей в QA.

автор
сама дурочка. Выдает как и прежде


Если Вы уже выполнили в текущем коннекте CREATE TABLE, то естественно, что следйющий CREATE TABLE без предварительного DROP вылелит с указанной ошибкой. Неужели это не понятно?!
17 янв 06, 16:54    [2262804]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
Heart
Member

Откуда:
Сообщений: 227
т.е. суть - в одном батче:
если временную таблицу создать и удалить и опять создать - так сделать нельзя.

если тоже самое делать с обычными таблицами - то это делать можно.

Так?

В Батче временную таблицу удалить нельзя. А обычную можно.
17 янв 06, 16:57    [2262820]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
Heart
Member

Откуда:
Сообщений: 227
автор
Если Вы уже выполнили в текущем коннекте CREATE TABLE, то естественно, что следйющий CREATE TABLE без предварительного DROP вылелит с указанной ошибкой. Неужели это не понятно?!

это как раз понятно изначально. Проблема в том что DROP похоже для временной таблицы команда не понятная..
17 янв 06, 16:59    [2262837]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
akaGlory
Guest
Heart
т.е. суть - в одном батче:
если временную таблицу создать и удалить и опять создать - так сделать нельзя.

если тоже самое делать с обычными таблицами - то это делать можно.

Так?

В Батче временную таблицу удалить нельзя. А обычную можно.


Очень медленно


В одном бэтче

нельзя

написать две команды SELECT INTO

в любые таблицы с одинаковыми именами.

Сервер так устроен

что еще при проверке текста запроса

выдаст ошибку

Невзирая на то, что у вас между SELECT INTO будет DROP.

И выполнения бэтча не произойдет
17 янв 06, 17:03    [2262870]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
Heart
Member

Откуда:
Сообщений: 227
автор
нельзя

написать две команды SELECT INTO

в любые таблицы с одинаковыми именами.

Сервер так устроен


почему тогда если я пишу
автор
DECLARE @config INT
SET @config = 0

SELECT * INTO Temp FROM _db...DataDif WHERE Config=@config
...
DROP TABLE Temp;

SET @config = 1
SELECT * INTO Temp FROM _db...DataDif WHERE Config=@config
...

проходит и проверка текста без ошибок и выполняется правильно

а если пришу вот так:
автор
DECLARE @config INT
SET @config = 0

SELECT * INTO #Temp FROM _db...DataDif WHERE Config=@config
...
DROP TABLE #Temp;

SET @config = 1
SELECT * INTO #Temp FROM _db...DataDif WHERE Config=@config
...

Выдаются ошибки.

разница только в том, что во втором случае таблицы ВРЕМЕННЫЕ.
17 янв 06, 17:07    [2262897]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Хм... Действительно, парадокс.

Работает:

SELECT * INTO Temp1 FROM sysobjects

DROP TABLE Temp1

SELECT * INTO Temp1 FROM sysobjects

DROP TABLE Temp1

Не работает:

SELECT * INTO Temp1 FROM sysobjects

DROP TABLE Temp1

SELECT * INTO Temp1 FROM sysobjects

DROP TABLE Temp1
17 янв 06, 17:07    [2262902]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Сорри, второй скрипт с временными таблицами должен быть:

SELECT * INTO #Temp1 FROM sysobjects

DROP TABLE #Temp1

SELECT * INTO #Temp1 FROM sysobjects

DROP TABLE #Temp1
17 янв 06, 17:08    [2262910]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

а ведь правду Heart пишет
вот это:
declare @temp table (id int)
declare @temp2 table (val int)

insert into @temp values (1)
insert into @temp2 values (2)

select * into temp111 from @temp

drop table temp111

select * into temp111 from @temp2
проходит на ура
а вот это - нет:
declare @temp table (id int)
declare @temp2 table (val int)

insert into @temp values (1)
insert into @temp2 values (2)

select * into #temp111 from @temp

drop table #temp111

select * into #temp111 from @temp2
видимо, это, действительно, только к временным таблицам относится...


Posted via ActualForum NNTP Server 1.3

17 янв 06, 17:10    [2262919]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
Heart
Member

Откуда:
Сообщений: 227
т.е. меня никто не спасет.

Спасибо всем. Буду выкарабкиваться.
17 янв 06, 17:17    [2262969]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
Al_B
Member

Откуда:
Сообщений: 478
Heart

разница только в том, что во втором случае таблицы ВРЕМЕННЫЕ.


Давайте я вам еще раз повторю - сервер не позволяет в одном батче создавать дважды одну временную таблицу. Это такая его особенность... Он тут ни при чем - его так запрограммировали... И он абсолютно равнодушен к вашему возмущению...
НО!!! Зато он позволяет создавать НЕСКОЛЬКО РАЗНЫХ таблиц... Намек понятен? ;)
Вот им и воспользуйтесь. Если жалко tempdb или места на дисках мало, то после использования данных каждой временной таблицы делайте truncate table #temp_N
17 янв 06, 17:26    [2263025]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
Heart
Member

Откуда:
Сообщений: 227
Я уже поняла. НО! а если я буду создавать и удалять обычные таблицы? Чем это чревато?
17 янв 06, 17:27    [2263036]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
Heart
Я уже поняла. НО! а если я буду создавать и удалять обычные таблицы? Чем это чревато?

Два пользователя одновременно запускают такую процедуру.
Одновременно вставляются данные
Дальше писать? ;)
17 янв 06, 17:29    [2263051]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
Al_B
Member

Откуда:
Сообщений: 478
Кстати - если создавать якобы одну таблицу внутри условных конструкций типа

if ....
--create table #temp ... (структура 1)
--select into #temp ...
...
else
--create table #temp ... (структура 2)
--select into #temp ...
....

то это тоже не прокатит....
17 янв 06, 17:31    [2263069]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
DeColo®es
Heart
Я уже поняла. НО! а если я буду создавать и удалять обычные таблицы? Чем это чревато?

Два пользователя одновременно запускают такую процедуру.
Одновременно вставляются данные
Дальше писать? ;)


Это решается просто.
Можно добавить в таблицу поле SPID c дефолтным значением @@SPID.
Затем работая с таблицей писать where spid = @@SPID
18 янв 06, 08:19    [2264153]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
Glory
Member

Откуда:
Сообщений: 104751
Deff
DeColo®es
Heart
Я уже поняла. НО! а если я буду создавать и удалять обычные таблицы? Чем это чревато?

Два пользователя одновременно запускают такую процедуру.
Одновременно вставляются данные
Дальше писать? ;)


Это решается просто.
Можно добавить в таблицу поле SPID c дефолтным значением @@SPID.
Затем работая с таблицей писать where spid = @@SPID

Тогда вообще отпадает необходимость создавать таблицы непосредственно в этом скрипте. )))
18 янв 06, 10:49    [2264604]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
WiRuc
Member

Откуда: Воронеж
Сообщений: 1280
pkarklin
Хм... Действительно, парадокс.

Работает:

SELECT * INTO Temp1 FROM sysobjects

DROP TABLE Temp1

SELECT * INTO Temp1 FROM sysobjects

DROP TABLE Temp1

Не работает:

SELECT * INTO Temp1 FROM sysobjects

DROP TABLE Temp1

SELECT * INTO Temp1 FROM sysobjects

DROP TABLE Temp1


Причина в том, что в случае постоянной таблицы Temp это реальное физическое имя таблицы, а в случае временной - логическое (все помнят, что физическое имя врем.таблицы серверу на момент компиляции неизвестно). Т.е. если в скрипте будут создаваться две постоянные таблицы с одинаковым именем и первая таблица по каким-либо причинам не будет удалена перед созданием второй, это приведет к ошибке выполнения. В случае с временной все сложнее. Если первая временная таблица не будет удалена, то при создании второй она будет создана с другим физическим именем, но ТЕМ ЖЕ САМЫМ логическим. Это приводит к противоречию, поэтому такие вещи отслеживаются на этапе компиляции.
18 янв 06, 11:03    [2264675]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
jak95
Member

Откуда:
Сообщений: 5
Еще интереснее, если сделать так:

SELECT * INTO #Temp1 FROM sysobjects

DROP TABLE tempdb..#Temp1
--DROP TABLE #Temp1

SELECT * FROM #Temp1

SELECT * INTO #Temp1 FROM sysobjects

DROP TABLE #Temp1

Строка DROP TABLE tempdb..#Temp1
убивает таблицу, но сервер выдает сообщение:
Server: Msg 2714, Level 16, State 1, Line 8
There is already an object named '#Temp1' in the database.
Database name 'tempdb' ignored, referencing object in tempdb.

Хотя физически, к моменту выполнения строки ее уже не существует.

Вывод, если нужна таблица в базе данных tempdb, то можно написать и:

SELECT * INTO tempdb..Temp1 FROM sysobjects

DROP TABLE tempdb..Temp1
--DROP TABLE #Temp1

--SELECT * FROM #Temp1

SELECT * INTO tempdb..Temp1 FROM sysobjects

DROP TABLE tempdb..Temp1

По идее, после перезагрузке сервера, она должна уничтожиться.
18 янв 06, 13:34    [2265484]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
aag
Member

Откуда: Москва
Сообщений: 1955
2 Heart
Разнесите эти дейтсвия по разным батчам и все.
PS. хотя плодить таблицы select * into ... с клиента - имхо, плохая практика.

Nobody faults but mine... (LZ)
18 янв 06, 13:46    [2265581]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
kto-to
Member

Откуда: Ukraine, Kyev
Сообщений: 835
а забавно себя эти зверьки (временные таблицы) ведут.
Не Знал!

if object_id('tmp_sp1') is not null  drop procedure tmp_sp1
go
create procedure tmp_sp1 as
 select top 1 * into #tmp from sysobjects; select * from #tmp
go
if object_id('tmp_sp2') is not null  drop procedure tmp_sp2
go
create  procedure  tmp_sp2 as
 select top 1 * into #tmp from sysusers; select * from #tmp
go

-- перва часть марлезонского балета  
select 1 i into #tmp 
select * from #tmp
exec ('update #tmp set i=2; select * from #tmp')
exec ('select top 1 * into #tmp from sysobjects; select * from #tmp')
select * from #tmp
exec ( ' select top 1 * into #tmp from sysusers; select * from #tmp')
select * from #tmp
drop table #tmp
go 

-- вторая  часть марлезонского балета  
select 1 i into #tmp 
exec tmp_sp1
select * from #tmp
exec tmp_sp2
select * from #tmp
drop table #tmp

go


18 янв 06, 14:51    [2265976]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
kto-to
Member

Откуда: Ukraine, Kyev
Сообщений: 835
Другими словами ты можеш переопределиьть временную таблицу в пределах другой ХП/батча до выхода из области его действия.
При выходе оживет старая.
18 янв 06, 14:54    [2265990]     Ответить | Цитировать Сообщить модератору
 Re: Удалить временную таблицу  [new]
Glory
Member

Откуда:
Сообщений: 104751
kto-to
Другими словами ты можеш переопределиьть временную таблицу в пределах другой ХП/батча до выхода из области его действия.
При выходе оживет старая.

Это все описано в CREATE TABLE - Temporary tables
18 янв 06, 14:55    [2266005]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить