Здравствуйте, KetchUp Inside aka Zig, Вы писали:
KIA>MSSQL2K KIA>вот такой запрос:
KIA>
KIA>if ( SELECT OBJECT_ID('tempdb..#t1') ) is not null
KIA>drop table #t1
KIA>create table #t1 (Дата datetime, Товар int, КолОптРос numeric(15, 4))
временная таблица сопоставляется с номером сессии. По этому в tempdb в системных таблицах она будет иметь название типа
___t156678 вообщем что-то в таком духе (что есть логично), поэтому ты не определишь есть она или нет таким способом.
KIA>выполненный в QA выдает
KIA>[sql]
KIA>Server: Msg 2714, Level 16, State 1, Line 13
KIA>There is already an object named '#t1' in the database.
KIA>
чтобы это побороть в QA
в начале скрипта create table
а в самом конце drop table.
Ну и еще, если у тебя после create table скрипт упал, то чтоб запустить его заново, надо сделать drop table
if ( SELECT OBJECT_ID('tempdb..#t1') ) is not null
drop table #t1
create table #t1 (Дата datetime, Товар int, КолОптРос numeric(15, 4))
create index ix_t1_date on #t1(Дата)
create index ix_t1_good on #t1(Товар)
if ( SELECT OBJECT_ID('tempdb..#t1') ) is not null
drop table #t1
create table #t1 (Дата datetime, Товар int, КолОптРос numeric(15, 4))
create index ix_t1_date on #t1(Дата)
create index ix_t1_good on #t1(Товар)
выполненный в QA выдает
Server: Msg 2714, Level 16, State 1, Line 13
There is already an object named '#t1' in the database.
Здравствуйте, KetchUp Inside aka Zig, Вы писали:
KIA>MSSQL2K KIA>вот такой запрос:
KIA>
KIA>if ( SELECT OBJECT_ID('tempdb..#t1') ) is not null
KIA>drop table #t1
KIA>create table #t1 (Дата datetime, Товар int, КолОптРос numeric(15, 4))
KIA>create index ix_t1_date on #t1(Дата)
KIA>create index ix_t1_good on #t1(Товар)
Попробуй вставить здесь GO
KIA>if ( SELECT OBJECT_ID('tempdb..#t1') ) is not null
KIA>drop table #t1
KIA>create table #t1 (Дата datetime, Товар int, КолОптРос numeric(15, 4))
KIA>create index ix_t1_date on #t1(Дата)
KIA>create index ix_t1_good on #t1(Товар)
KIA>
Здравствуйте, KetchUp Inside aka Zig, Вы писали:
KIA>
KIA>if ( SELECT OBJECT_ID('tempdb..#t1') ) is not null
KIA>drop table #t1
KIA>create table #t1 (Дата datetime, Товар int, КолОптРос numeric(15, 4))
KIA>create index ix_t1_date on #t1(Дата)
KIA>create index ix_t1_good on #t1(Товар)
KIA>if ( SELECT OBJECT_ID('tempdb..#t1') ) is not null
KIA>drop table #t1
GO
KIA>create table #t1 (Дата datetime, Товар int, КолОптРос numeric(15, 4))
KIA>create index ix_t1_date on #t1(Дата)
KIA>create index ix_t1_good on #t1(Товар)
KIA>
Здравствуйте, Andy_MAN, Вы писали:
A_M>Попробуй вставить здесь GO
нельзя
еще раньше определена локальная переменная и она используется в запросах, которые идут после приведенного кода
если ставишь GO — она теряется из области видимости
Re: drop / create table
От:
Аноним
Дата:
22.01.04 08:29
Оценка:
Здравствуйте, KetchUp Inside aka Zig, Вы писали:
KIA>MSSQL2K KIA>вот такой запрос:
KIA>
KIA>if ( SELECT OBJECT_ID('tempdb..#t1') ) is not null
KIA>drop table #t1
KIA>create table #t1 (Дата datetime, Товар int, КолОптРос numeric(15, 4))
KIA>create index ix_t1_date on #t1(Дата)
KIA>create index ix_t1_good on #t1(Товар)
KIA>if ( SELECT OBJECT_ID('tempdb..#t1') ) is not null
KIA>drop table #t1
KIA>create table #t1 (Дата datetime, Товар int, КолОптРос numeric(15, 4))
KIA>create index ix_t1_date on #t1(Дата)
KIA>create index ix_t1_good on #t1(Товар)
KIA>
KIA>выполненный в QA выдает
KIA>
KIA>Server: Msg 2714, Level 16, State 1, Line 13
KIA>There is already an object named '#t1' in the database.
KIA>
KIA>может кто подскажет как это побороть?
if OBJECT_ID('tempdb..#t1','U') is not null
drop table #t1
create table #t1 (Дата datetime, Товар int, КолОптРос numeric(15, 4))
create index ix_t1_date on #t1(Дата)
create index ix_t1_good on #t1(Товар)
go
if OBJECT_ID('tempdb..#t1','U') is not null
drop table #t1
create table #t1 (Дата datetime, Товар int, КолОптРос numeric(15, 4))
create index ix_t1_date on #t1(Дата)
create index ix_t1_good on #t1(Товар)
Здравствуйте, andik, Вы писали:
A>временная таблица сопоставляется с номером сессии. По этому в tempdb в системных таблицах она будет иметь название типа A>___t156678 вообщем что-то в таком духе (что есть логично), поэтому ты не определишь есть она или нет таким способом.
ну как раз с этим-то проблем нет никаких все определяется и работает так как надо
просто не получается выполнить prepare для запроса — поэтому и возникает ошибка — тут тоже все ясно... но как побороть?
A>в начале скрипта create table A>а в самом конце drop table.
хм... как выход — сделать имена всех временных таблиц уникальными...
но мне просто интересно, есть ли другой способ обойти данную проблему
Здравствуйте, KetchUp Inside aka Zig, Вы писали:
KIA>вот такой запрос:
KIA>
KIA>if ( SELECT OBJECT_ID('tempdb..#t1') ) is not null
KIA>drop table #t1
KIA>create table #t1 (Дата datetime, Товар int, КолОптРос numeric(15, 4))
KIA>create index ix_t1_date on #t1(Дата)
KIA>create index ix_t1_good on #t1(Товар)
KIA>if ( SELECT OBJECT_ID('tempdb..#t1') ) is not null
KIA>drop table #t1
KIA>create table #t1 (Дата datetime, Товар int, КолОптРос numeric(15, 4))
KIA>create index ix_t1_date on #t1(Дата)
KIA>create index ix_t1_good on #t1(Товар)
KIA>
KIA>выполненный в QA выдает
KIA>
KIA>Server: Msg 2714, Level 16, State 1, Line 13
KIA>There is already an object named '#t1' in the database.
KIA>
KIA>может кто подскажет как это побороть?
ИМХО анализатор запросов не может определить, что в момент второго "create table" эта таблица однозначно будет дропнута. Либо это глюк(недоработка?), либо он руководствуется неизвестными нам соображениями, например, предполагая, что он будет распараллеливать этот запрос?
Попробуй обойтись одной таблицей, не пересоздавая ее. Например, в некоторых случаях можно просто очищать ее перед следующим проходом.
Здравствуйте, seregaa, Вы писали:
S>ИМХО анализатор запросов не может определить, что в момент второго "create table" эта таблица однозначно будет дропнута. Либо это глюк(недоработка?), либо он руководствуется неизвестными нам соображениями, например, предполагая, что он будет распараллеливать этот запрос?
A local temporary table created within a stored procedure or trigger is distinct from a temporary table with the same name created before the stored procedure or trigger is called. If a query references a temporary table, and two temporary tables with the same name exist at that time, it is not defined which table the query is resolved against. Nested stored procedures can also create temporary tables with the same name as a temporary table created by the stored procedure that called it. All references to the table name in the nested stored procedure are resolved to the table created in the nested procedure, for example:
CREATE PROCEDURE Test2
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (2)
SELECT Test2Col = x FROM #t
GO
CREATE PROCEDURE Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (1)
SELECT Test1Col = x FROM #t
EXEC Test2
GO
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (99)
GO
EXEC Test1
GO
S>Попробуй обойтись одной таблицей, не пересоздавая ее. Например, в некоторых случаях можно просто очищать ее перед следующим проходом.
согласен
Здравствуйте, KetchUp Inside aka Zig, Вы писали:
KIA>Здравствуйте, andik, Вы писали:
A>временная таблица сопоставляется с номером сессии. По этому в tempdb в системных таблицах она будет иметь название типа A>___t156678 вообщем что-то в таком духе (что есть логично), поэтому ты не определишь есть она или нет таким способом.
KIA>ну как раз с этим-то проблем нет никаких все определяется и работает так как надо
мда, лоханулся я с OBJECT_ID
KIA>просто не получается выполнить prepare для запроса — поэтому и возникает ошибка — тут тоже все ясно... но как побороть?
KIA>хм... как выход — сделать имена всех временных таблиц уникальными... KIA>но мне просто интересно, есть ли другой способ обойти данную проблему
Здравствуйте, KetchUp Inside aka Zig, Вы писали:
A_M>>Попробуй вставить здесь GO
KIA>нельзя KIA>еще раньше определена локальная переменная и она используется в запросах, которые идут после приведенного кода KIA>если ставишь GO — она теряется из области видимости
Ясно. А реальной жизни, как и в примере, структура #t1 постоянная? Если да, то может быть просто делать
Всем большое спасибо!
К сожалению, тот ответ который хотелось, я не услышал.
Поступил просто — дал таблицам уникальные имена (задача позволяла сделать это).
Просто хотелось найти какое-то другое решение
Еще раз спасибо
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, KetchUp Inside aka Zig, Вы писали:
KIA>>может кто подскажет как это побороть?
L>В таких случаях я обычно ставлю галку Tools>Options>Connections>Disconnect after query executes
запросы предназначались для DTS Package, так что это не очень-то поможет...