Форум: "Базы";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
ВнизSQL Найти похожие ветки
← →
Alibaba (2003-09-29 17:30) [0]Народ, такой вопрос.
Если мне необходимо:
select A, B from C
я использую TQuery. Open;
Если мне необходимо:
insert into D
select A, B from C
я использую TQuery. ExecSQL;
А если мне необходимо:
select A,B
into D
from C
Ни Open ни ExecSQL не работают.
Что использовать в этом случае?
← →
Reindeer Moss Eater (2003-09-29 17:31) [1]Справочное руководство по TransactSQL
← →
Vlad (2003-09-29 17:34) [2]select A,B
into :D
from C
← →
Alibaba (2003-09-29 17:42) [3]>Vlad © (29.09.03 17:34) [2]
Появляется ошибка:
Cursor must be opened before this command type can be initialized
← →
Vlad (2003-09-29 17:49) [4]Вобщем не знаю как в MSSQL, а в оракле, напр. запрос выглядел бы след. образом:
begin
select A,B into :D, :E from C;
end;
Предварительно необходимо в Query определить параметр :D, :E
Затем Open (или ExecSql)
Думаю, там что-то похожее.
← →
Alibaba (2003-09-29 18:10) [5]>Vlad © (29.09.03 17:49) [4]
Откуда появился термин параметр?
Я в своем вопросе не упоминал ни о каких параметрах.
Вариант №1
Есть sql-запрос:
select Field_A, Field_B
from Table_C
Берем TQuery, в свойстве SQL - прописываем этот запрос.
Для выполнения этого запроса выполняем: Query1.Open
Вариант №2
Есть sql-запрос:
insert into Table_D
select Field_A, Field_B
from Table_C
Берем TQuery, в свойстве SQL - прописываем этот запрос.
Для выполнения этого запроса выполняем: Query1.ExecSQL
Вариант №3
Есть sql-запрос:
select Field_A, Field_B
into Table_D
from Table_C
Берем TQuery, в свойстве SQL - прописываем этот запрос.
Для выполнения этого запроса выполняем:
Query1.Open - ошибка
Query1.ExecSQL - ошибка
Можни ли в этом варианте выполнить запрос?
← →
Vlad (2003-09-29 18:16) [6]>Alibaba © (29.09.03 18:10) [5]
Сорри, не так понял.
Я думал речь идет о переменных.
Тогда не знаю.
← →
MaxDDinc (2003-09-29 18:16) [7]В первом запросе - обычная выборка,
во втором - вставка выборки,
а в третьем ты сам-то понял, что написал ??????
Выборка может быть загружена в параметр запроса, это используется в процедурах и функциях, а у тебя фигня :(
SQL, он структурированый, ты не можешь выполнить вторую часть, если не закончил первую, у тебя первая часть:
select a, b
from c
и вторая:
insert into d
Лучше поясни, что сделать надо ?
← →
ZrenBy (2003-09-29 18:22) [8]>>MaxDDinc (29.09.03 18:16) [7]
Вот уж не надо...
from BOL
Inserting Rows Using SELECT INTO
The SELECT INTO statement creates a new table and populates it with the result set of the SELECT. The structure of the new table is defined by the attributes of the expressions in the select list, for example:
SELECT Shippers.*, Link.Address, Link.City,
Link.Region, Link.PostalCode
INTO NewShippers
FROM Shippers
JOIN LinkServer.DB.dbo.Shippers AS Link
ON (Shippers.ShipperID = Link.ShipperID)
SELECT INTO can be used to combine data from several tables or views into one table. It can also be used to create a new table containing data selected from a linked server.
>>Alibaba © (29.09.03 17:30)
А сам-то запрос выполняется ? В таблице D что-нибудь
появляется?
← →
MaxDDinc (2003-09-29 18:29) [9]>>ZrenBy © (29.09.03 18:22) [8]
У Вас в первой строке SELECT уже определены таблицы для выборки:
из таблицы shippers выбрать все, а из link выбрать address, city, region и postalcode, таким образом уже ясно, что надо выбирать, а дальше - вставка и join и т.д.
А в примере выше нет определения таблиц для выборки ...
← →
ZrenBy (2003-09-29 18:39) [10]>>Query1.Open - ошибка
>>Query1.ExecSQL - ошибка
Блин, что за ошибка ?
← →
MaxDDinc (2003-09-29 18:41) [11]Для выборкки используй TQuery, а для вставки, удаления - TStoredProc !
← →
sniknik (2003-09-29 22:57) [12]ZrenBy © (29.09.03 18:39) [10]
>>>Query1.Open - ошибка
>>>Query1.ExecSQL - ошибка
>Блин, что за ошибка ?
читай между строк, там все написано, если непонятно поясню (на подработку начинающим телепатом чтоли устроится ;о)).
читаем исходный вопрос.
....
>Если мне необходимо:
>insert into D
>select A, B from C
>я использую TQuery.ExecSQL;
т.е. таблица D существует если ошибок не дает.
>А если мне необходимо:
>select A,B
>into D
>from C
>Ни Open ни ExecSQL не работают.
в ту же таблицу(?) "селект инту" не сработает. о том что менялась база или имя таблици на D2, к примеру. ни слова, а зная
( Alibaba © (29.09.03 18:10) [5])
>Откуда появился термин параметр?
>Я в своем вопросе не упоминал ни о каких параметрах.)
как щепетильно автор относится к своим словам можно предположить, что и не сделано. т.е. ошибка будет звучать примерно так (в вольном переводе) "куды пихаеш? не видиш есть уже табличка!!!".
уфф... завлекательнее чем кроссворды. ;о)) тока писать обьяснения упаришся.
← →
Alibaba (2003-10-02 01:12) [13]Для выполнения SQL-запросов использую два инструмента:
1. SQL Advantager
2. Delphi
Все три приведенных мной варианта работают в SQL Advantager.
В Delphi (использую TQuery) работает только первый вариант (выборка) и второй (вставка).
Третий вариант (выборка одновременно с вставкой) - работать не хочет. Delphi выдает ошибку "Cursor must be opened"
В принципе, решить третий вариант можно, разбив его на две части (собственно так я сейчас и делаю)
1. Create table Table_D (ExecSQL)
2. Insert into Table_D
Select Field_A, Field_B
From Table_C (ExecSQL)
Если делать два шага: создавать таблицу и наполнять её - то все работает.
Если делать это за один присест: вставлять данные в новую еще не существующую таблицу - не работает.
Обратите внимание, что в SQL Advantager (если кто знаком) - вариант "за один присест" проходит.
← →
NAlexey (2003-10-02 09:11) [14]Используй временную. В твоем случае будет выглядеть так:
select A, B into #D from C
insert D select A, B from #D
drop table #D
← →
Johnmen (2003-10-02 09:22) [15]В параметрах алиаса или в переопределяемых параметрах TDatabase укажи SQLQRYMODE=SERVER
← →
NAlexey (2003-10-02 09:50) [16]Да и еще: Зачем на каждое действие выполнять по запросу?
Кладу на форму TADOQuery, кладу на форму TDataSource, кладу на форму DBGrid. Все соединяю, пишу в TADOQuery.SQL:
select top 10 * into #MustDie from Table
select * from #MustDie
drop table #MustDie
Делаю прям в дизайне Active := True; Все прекрасно видно...
Зачем на каждый оператор по Exec или Open? Да ты хоть в этот TQuery текст своей процедуры запихай с сотней Insert главное сделай где нибудь Select from и будет тебе набор данных.
← →
Johnmen (2003-10-02 10:14) [17]>NAlexey ©
Не путай АДО с БДЕ.
← →
NAlexey (2003-10-02 10:26) [18]>Johnmen ©
Не вижу разницы, с легкостью проделаю тоже самое в BDE.
← →
Johnmen (2003-10-02 10:36) [19]>NAlexey © (02.10.03 10:26)
Проделай, проделай...:) О результатах сообщи.
← →
NAlexey (2003-10-02 10:40) [20]Уже проделал, результаты такиеже:
1) Создаю alias в BDE
2) Кладу на форму TQuery, кладу DbGrid, кладу TDataSource, соединяю все это
3) Пишу в TQuery.SQL:
select top 10 * into #MustDie from Table
select * from #MustDie
drop table #MustDie
4) Делаю в design time Active := True; Все прекрасно видно...
← →
Zelius (2003-10-02 11:10) [21]
> Alibaba © (29.09.03 17:30)
используе форму не select into, а insert into Table1 (columns) values (values) select columns from Table2
и будет счастье!
← →
Alibaba (2003-10-02 11:23) [22]>Johnmen © (02.10.03 09:22) [15]
Сначала так и стояло: SQLQRYMODE=SERVER
>Johnmen © (02.10.03 10:14) [17]
Путать действительно не надо. :))
Разные вещи, все таки...
>Zelius © (02.10.03 11:10) [21]
Счастье это всегда хорошо. :))
insert into можно использовать, когда таблица уже существует. (Alibaba © (02.10.03 01:12) [13])
>
← →
Zelius (2003-10-02 11:29) [23]
> insert into можно использовать, когда таблица уже существует.
> (Alibaba © (02.10.03 01:12) [13])
тогда проверяй ее на существование и если ее нет, то создавай...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.009 c