Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Вниз

Почему парсер в queryAnalizer-е выдает ошибку   Найти похожие ветки 

 
Bless ©   (2004-09-29 16:02) [0]

There is already an object named "#t" in the database.
на нижеследующий код.

declare @x int
set @x=0
if @x>0 select * into #t from shabp
else select * into #t from pozib

Причем если убрать строчку с else, то все нормально компилируется.


 
MOA ©   (2004-09-29 16:21) [1]

Из BOL (описание IF..ELSE):

CREATE TABLE or SELECT INTO statements must refer to the same table name if the CREATE TABLE or SELECT INTO statements are used in both the IF and ELSE areas of the IF...ELSE block.

Удачи!


 
Bless ©   (2004-09-29 16:35) [2]

MOA [1]>
Какой-то у меня непонятный перевод получается. Это ведь переводится как "конструкции CREATE TABLE или SELECT INTO должны ссылаться на одинаковое имя таблицы, если они используются и в секции IF и в секции ELSE"?

Так у меня они и так ссылаются на одну таблицу #t


 
stone ©   (2004-09-29 16:49) [3]


> There is already an object named "#t" in the database.

ты лучше это переведи


 
Bless ©   (2004-09-29 16:50) [4]

stone ©  (29.09.04 16:49) [3]>
Ну и?


 
stone ©   (2004-09-29 17:06) [5]


> Ну и?

что и? перевел уже?


 
Bless ©   (2004-09-29 17:09) [6]

stone[5]>
>что и? перевел уже?

:))))
Да вроде бы. Озвучить? Озвучиваю: объект с именем #t уже есть в базе данных.
Ну и?


 
stone ©   (2004-09-29 17:11) [7]

Ни на какие мысли не наводит?
Попробую пояснить
При первом выполнении команды select into создается таблица с указанным именем. При попытке повторного выполнения команды ты и получаешь сообщение об ошибке.


 
MOA ©   (2004-09-29 17:18) [8]

Вот тут с десяток веточек с той же проблемой:
http://www.sql.ru/forum/actualsearch.aspx?search=if+else+select+into+%EE%F8%E8%E1%EA%E0+There+is+already+an+object+named &a=&ma=0&bid=1&dt=-1&s=1&so=1


 
Bless ©   (2004-09-29 17:19) [9]

stone ©  (29.09.04 17:11) [7]>
Никакого выполнения команды select into не было вообще.
Ругается при разборке синтаксиса (ctrl+f5 в query Analizer-e), а не при выполнении.
MAO привел цитату, но я ее как-то не понимаю. А сам MAO пропал куда-то :(


 
clickmaker ©   (2004-09-29 17:26) [10]


> Bless ©   (29.09.04 16:02)

Явно создавай #t


 
stone ©   (2004-09-29 17:26) [11]


> Никакого выполнения команды select into не было вообще.

Никогда-никогда? К F5 даже не притрагивался ни разу? и мышкой на Execute Query ни разу не нажимал?
НЕ ВЕРЮ! (С) Станиславский


 
Bless ©   (2004-09-29 17:26) [12]

MOA ©  (29.09.04 17:18) [8]>
Спасибо, почитаю


 
stone ©   (2004-09-29 17:26) [13]


> Никакого выполнения команды select into не было вообще.

Никогда-никогда? К F5 даже не притрагивался ни разу? и мышкой на Execute Query ни разу не нажимал?
НЕ ВЕРЮ! (С) Станиславский


 
Bless ©   (2004-09-29 18:05) [14]

stone[13]>
>НЕ ВЕРЮ! (С) Станиславский

- Ты суслика видишь?
- Нет.
- И я нет. А он есть
(c) ДМБ.

Сходи по ссылкам из [8], узнаешь много интересного.

>Явно создавай #t

MOA[8]> Еще раз спасибо. Саме то, что надо.
Да видно так и придется. Просто не хотелось делать INSERT INTO
потому что придется перечислять все поля, а их больше 30.


 
Nikolay M. ©   (2004-09-29 18:11) [15]


> Просто не хотелось делать INSERT INTO
> потому что придется перечислять все поля, а их больше 30.

Хоть 100 полей. В QA поднимаешь скрипты на создание таблиц shabp и pozib, меняешь названия на #t.


 
sniknik ©   (2004-09-29 18:15) [16]

> Просто не хотелось делать INSERT INTO
> потому что придется перечислять все поля, а их больше 30.
из ссылок
http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=2698&hl=if+else+select+into+%ee%f8%e8%e1%ea%e0+There+is+already+an+o bject+named
пост AnKa

кстати там и решение приводится, более менее подходяшее (даже несколько если подумать, пара точно есть)


 
Bless ©   (2004-09-30 10:56) [17]

sniknik ©  (29.09.04 18:15) [16]>
фокус с WHERE 1=0 я тоже знаю.
Только от перечисления всех полей в  INSERT INTO это не избавит.
И при изменении структуры таблицы мне придется править процедуру.
Ну это я уже привередничаю, конечно. :)

Приз за самое красивое решение проблемы я бы отдал DArtem-у.
Из топика "Чудеса SELECT INTO" (кажется). Адрес - в [8].
За предложенный им вариант:
IF ...
 select into #TempTable
ELSE
 exec("select into #TempTable")

Им я наверное и воспользуюсь. (Вот только выясню, что эффективнее SELECT INTO или CREATE + INSERT INTO, а то в топиках высказывались диаметрально противоположные мнения.)


 
stone ©   (2004-09-30 11:09) [18]

2 Bless ©
а ты так ничего и не понял
Про временные таблицы, видимо, тоже толком не читал. В противном случае знал бы, какие особенности придает таблице значек #. Тогда и вопрос бы твой решился сам по себе.

ЗЫ. Желаю удачного танца по граблям...


 
sniknik ©   (2004-09-30 11:32) [19]

Bless ©   (30.09.04 10:56) [17]
> За предложенный им вариант:
> IF ...
>  select into #TempTable
> ELSE
>  exec("select into #TempTable")

> Им я наверное и воспользуюсь.

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

IF ...
select into ##TempTable
ELSE
exec("select into ##TempTable")

вот так будет работать, но наверное добавит других проблем (как там у тебя по смыслу процедуры)


 
MOA ©   (2004-09-30 11:34) [20]

Вариант exec("select into #TempTable") не заработает - таблицу вне батча (exec) увидеть не удастся - она будет удалена, поскольку временная ;).
CREATE + INSERT должно быть быстрее чем INSERT INTO
Офтопик: IMHO, стоит явно перечислять поля - это поможет в дальнейшем (например, когда Вы будете разбираться в коде через год). Частое добавление полей в таблицы базы чаще всего говорит скорее о неважной проработке проекта.
Удачи!


 
MOA ©   (2004-09-30 11:37) [21]

Проблема с решением на глобальных временных таблицах возникнет сразу, как только два юзера попытаются выполнить процедуру ;).
Стоит ли городить огород только для того, чтобы написать звёздочку? Вот так экономия времени ;).


 
sniknik ©   (2004-09-30 11:59) [22]

> Проблема с решением на глобальных временных таблицах возникнет сразу, как только два юзера попытаются выполнить процедуру ;).
ну видимо поэтому и не упоминали.

по мне тоже, проше использовать разные имена и все, чем извращатся.


 
Bless ©   (2004-09-30 12:08) [23]

sniknik [19]>
MOA [20]>
Вы ошибаетесь. Я проверял работоспособность понравившегося мне кода, прежде, чем запостить сюда: все работает.
>в таком виде решение нерабочее, там же и обьяснялось почему

Это не в этом топике. Нерабочим является вариан с sp_executesql.
А exec - это не батч и не процедура. Это команда(?) execute.


 
sniknik ©   (2004-09-30 12:28) [24]

> Вы ошибаетесь.
проверь вот это, на тестовой базе Northwind (или замени своими таблицами)

SET NOCOUNT ON

IF 1=0
 select *  into #TempTable FROM Orders
ELSE
 exec("select * into #TempTable FROM Orders")

select *  from #TempTable


есть результат? (рекордсет)


 
MOA ©   (2004-09-30 12:31) [25]

Засомневался и вот сейчас специально попробовал - с exec не работает - "Invalid object name #t".


 
Bless ©   (2004-09-30 13:10) [26]

Мдя. Действительно не работает. Непонятно только, как я проверял. Прошу прощения за дезинформацию.

Ладно. Придется сначала создавать, а потом вставлять.

>CREATE + INSERT должно быть быстрее чем INSERT INTO

Если имелось в виду "быстрее чем SELECT INTO", то у меня имеются сомнения.
Профайлер говорит, что наоборот. Или я опять что-то напутал?


 
MOA ©   (2004-09-30 13:38) [27]

Проверил.
Таблица названий месяцев Month(ID_Month Integer,Name Char(10), Name_Rod char(10)), 12 записей.
Процедуры:

CREATE   PROCEDURE up_TestProc2
AS
BEGIN
SET NOCOUNT ON
SELECT * INTO #t FROM dbo.Month
END

CREATE   PROCEDURE up_TestProc3
AS
BEGIN
SET NOCOUNT ON
CREATE TABLE #t(
 ID_Month Integer,
 Name Char(10),
 Name_Rod char(10)
)
INSERT INTO #t(
 ID_Month,
 Name,
 Name_Rod
)
SELECT
 ID_Month,
 Name,
 Name_Rod
FROM dbo.Month
END

CREATE   PROCEDURE up_TestProc4
AS
BEGIN
SET NOCOUNT ON
DECLARE @t TABLE (
 ID_Month Integer,
 Name Char(10),
 Name_Rod char(10)
)
INSERT INTO @t(
 ID_Month,
 Name,
 Name_Rod
)
SELECT
 ID_Month,
 Name,
 Name_Rod
FROM dbo.Month
END
--Запускающая процедура - подставляется название вызываемой ХП

CREATE   PROCEDURE up_TestProc1
AS
BEGIN
SET NOCOUNT ON
DECLARE @I Integer
SET @I=0
WHILE @I < 10000
BEGIN
 EXEC dbo.up_TestProc4
 SET @I=@I+1
END
END

Результаты:
SELECT .. INTO (up_TestProc2): 21 c
CREATE TABLE (up_TestProc3): 15 c
DECLARE TABLE (up_TestProc4): 9 c

Вполне ожидаемые результаты ;)


 
Bless ©   (2004-09-30 14:35) [28]

MOA[27]>
>21 c
с - это секунды?!

А вот мой пример (в таблице t1 27448 записей):
create table #t (name varchar(200))
insert into #t select name from t1
drop table #t
go
select name into #t from t1
drop table #t

Вот, что показал профайлер (1-ая цифра - для первого батча, 2-ая - для второго):
CPU: 500 156
READS: 29832 1152


 
Bless ©   (2004-09-30 14:45) [29]

>с - это секунды?!
А, ну да, там же 10000. Тогда нормально.


 
Bless ©   (2004-09-30 17:32) [30]

Еще такой вопрос.
Если делать select * into #t from  t1 WHERE 1=0, а затем INSERT INTO #t, то возникает такая проблема: в t1 одно поле - автоинкрементное. И в #t - получается тоже.
Как установить IDENTITY_INSERT в ON для временной таблицы?


 
sniknik ©   (2004-09-30 17:55) [31]

SET IDENTITY_INSERT #t ON
не получается?


 
Bless ©   (2004-10-01 11:52) [32]

sniknik ©  (30.09.04 17:55) [31]>
Неа.


 
sniknik ©   (2004-10-01 12:12) [33]

странно, вчера у меня получалось почемуто, сегодня тоже нет.  
ну тогда создавай таблицу по другому, перечисление полей придется делать
SELECT Cast(ID as INT) AS ID, Name INTO #t FROM  Table WHERE 1=0
ID понятно был автоинкрементом.


 
Bless ©   (2004-10-01 12:12) [34]

sniknik ©  (30.09.04 17:55) [31]>
Неа.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.039 c
1-1097607921
Alexey Romanskiy
2004-10-12 23:05
2004.10.31
HTML в webbrowser


14-1097551845
pkm
2004-10-12 07:30
2004.10.31
Виртуальный диск.


1-1097749139
UserUserov
2004-10-14 14:18
2004.10.31
DOS команды


14-1097132909
Mike Kouzmine
2004-10-07 11:08
2004.10.31
На юге африки нашли снежного человека!


3-1096696321
kaginava
2004-10-02 09:52
2004.10.31
Ошибка при выполнени запроса на вставку записей





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский