Форум: "Базы";
Текущий архив: 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.033 c