![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL [D6, MSSQL]
Alibaba © (2003-09-29 17:30:00)
Народ, такой вопрос.
Если мне необходимо:
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 не работают.
Что использовать в этом случае?
Zelius (2003-10-02 11:29:00) [1]
> insert into можно использовать, когда таблица уже существует.
> (Alibaba © (02.10.03 01:12) [13])
тогда проверяй ее на существование и если ее нет, то создавай...
Alibaba (2003-10-02 11:23:00) [2]
>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:10:00) [3]
> Alibaba © (29.09.03 17:30)
используе форму не select into, а insert into Table1 (columns) values (values) select columns from Table2
и будет счастье!
NAlexey (2003-10-02 10:40:00) [4]
Уже проделал, результаты такиеже:
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; Все прекрасно видно...
Johnmen (2003-10-02 10:36:00) [5]
>NAlexey © (02.10.03 10:26)
Проделай, проделай...:) О результатах сообщи.
NAlexey (2003-10-02 10:26:00) [6]
>Johnmen ©
Не вижу разницы, с легкостью проделаю тоже самое в BDE.
Johnmen (2003-10-02 10:14:00) [7]
>NAlexey ©
Не путай АДО с БДЕ.
NAlexey (2003-10-02 09:50:00) [8]
Да и еще: Зачем на каждое действие выполнять по запросу?
Кладу на форму 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 09:22:00) [9]
В параметрах алиаса или в переопределяемых параметрах TDatabase укажи SQLQRYMODE=SERVER
NAlexey (2003-10-02 09:11:00) [10]
Используй временную. В твоем случае будет выглядеть так:
select A, B into #D from C
insert D select A, B from #D
drop table #D
Alibaba (2003-10-02 01:12:00) [11]
Для выполнения 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 (если кто знаком) - вариант "за один присест" проходит.
sniknik (2003-09-29 22:57:00) [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])
>Откуда появился термин параметр?
>Я в своем вопросе не упоминал ни о каких параметрах.)
как щепетильно автор относится к своимсловам можно предположить, что и не сделано. т.е. ошибка будет звучать примерно так (в вольном переводе) "куды пихаеш? не видиш есть уже табличка!!!".
уфф... завлекательнее чем кроссворды. ;о)) тока писать обьяснения упаришся.
MaxDDinc (2003-09-29 18:41:00) [13]
Для выборкки используй TQuery, а для вставки, удаления - TStoredProc !
ZrenBy (2003-09-29 18:39:00) [14]
>>Query1.Open - ошибка
>>Query1.ExecSQL - ошибка
Блин, что за ошибка ?
MaxDDinc (2003-09-29 18:29:00) [15]
>>ZrenBy © (29.09.03 18:22) [8]
У Вас в первой строке SELECT уже определены таблицы для выборки:
из таблицы shippers выбрать все, а из link выбрать address, city, region и postalcode, таким образом уже ясно, что надо выбирать, а дальше - вставка и join и т.д.
А в примере выше нет определения таблиц для выборки ...
ZrenBy (2003-09-29 18:22:00) [16]
>>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:16:00) [17]
В первом запросе - обычная выборка,
во втором - вставка выборки,
а в третьем ты сам-то понял, что написал ??????
Выборка может быть загружена в параметр запроса, это используется в процедурах и функциях, а у тебя фигня :(
SQL, он структурированый, ты не можешь выполнить вторую часть, если не закончил первую, у тебя первая часть:
select a, b
from c
и вторая:
insert into d
Лучше поясни, что сделать надо ?
Vlad (2003-09-29 18:16:00) [18]
>Alibaba © (29.09.03 18:10) [5]
Сорри, не так понял.
Я думал речь идет о переменных.
Тогда не знаю.
Alibaba (2003-09-29 18:10:00) [19]
>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 17:49:00) [20]
Вобщем не знаю как в MSSQL, а в оракле, напр. запрос выглядел бы след. образом:
begin
select A,B into :D, :E from C;
end;
Предварительно необходимо в Query определить параметр :D, :E
Затем Open (или ExecSql)
Думаю, там что-то похожее.