-
AdoQuery1.SQL.Text := 'drop table table1';
try AdoQuery1.ExecSQL;
except; end;
AdoQuery1.SQL.Text := 'create table table1 ( 'id int NOT NULL identity(1,1) PRIMARY KEY, name varchar(50) NULL ... )';
AdoQuery1.ExecSQL;
На второй execsql выдает general exception "в базе уже есть объект с таким именем". Как это делать правильно?
-
сказано же что есть уже такой объект
-
Как это делать правильно?
Правильно - это не писать таких конструкций
try
...
except
end;
-
if not exists (select 1 from sysobjects where id = object_id('Table1') and type = 'U')
begin
create table Table1 (
id int NOT NULL identity(1,1),
.....
constraint PK_Table1 primary key (id)
);
end;
-
Значит, реализация SQL в Delphi7 мягко говоря неполная?
-
мда. глубокая мысль.
-
реализация SQL в Delphi7 мягко говоря неполная?
Я бы сказал еще категоричнее.
В делфи вообще нет никакой реализации SQL.
-
> Ega23 © (29.12.09 12:26) [3]
а если таблица уже есть, а я хочу изменить столбцы, alter table? Логичнее
drop
create table
Да и пробовал я это. ExecSQL ругается на несколько операций в 1 запросе.
> В делфи вообще нет никакой реализации SQL.
Но ведь каждый делает ЭТО. А ты как создаешь таблицы?
-
Но ведь каждый делает ЭТО.
Это еще не значит, что реализация языка SQL находится в делфи.
-
На второй execsql выдает general exception "в базе уже есть объект с таким именем". Как это делать правильно?
не вызывать create table если создаваемая таблица уже есть в базе данных.
-
просто таблица "жива еще". Надо как-то подтвердить drop
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Contract]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Contract]
GO
так делает isqlw.exe
последнее go разделяет пакет для mssql
следующие команды будут в другом пакете, и для них таблицы уже не будет
-
для начала полезно будет просто убрать обработку трай/эксепт в таком дурацком исполнении.
-
> убрать обработку трай/эксепт в таком дурацком исполнении
Ну при чем тут try? Похоже, ты мастеришь таблицы в management studio.
> просто таблица "жива еще".
Вот это правильно! Но 'Go' ExecSQL не берет ни в каком виде. Неверная stored-процедура, неверный синтаксис если после if exists.
-
> [7] ocean (29.12.09 12:47)
> Но ведь каждый делает ЭТО.
Наверное я неправильный совсем. Ни разу не создавал таблицы из своих программ.
-
потому что нет такой команды как go :)
-
> Вот это правильно! Но 'Go' ExecSQL не берет ни в каком виде.
> Неверная stored-процедура, неверный синтаксис если после
> if exists.
команда GO - суть разделитель транзакций в MSSQL.
-
> Ну при чем тут try? Похоже, ты мастеришь таблицы в management studio.
еще одна глубокая мысль...
try тут не причем, причем тут "срезанный" им эксепт который мог бы тебе объяснить почему команда на удаление не сработала.
-
> Наверное я неправильный совсем. Ни разу не создавал таблицы
> из своих программ.
Ну пуркуа бы и не па?
Просто аккуратно надо этим пользоваться, вот и всё.
-
> причем тут "срезанный" им эксепт
try не срезает "ексепт" во время design. Еще раз говорю, drop ошибок не выдает. Вот эта мысль разумная,
> if not exists (select 1 from sysobjects where id = object_id('Table1')
Только ради вас, я пишу:
AdoQuery1.SQL.Text := 'if object_id(''table1'',''U'') IS NOT NULL drop table table1';
AdoQuery1.ExecSQL;
AdoQuery1.SQL.Text := 'create table ...
Результат не меняется. Ребята, вы очень глубокомысленны, но вопрос-то простой?
-
да ладно, на :)
ADOQuery1.SQL.Text:='drop table table1'
ADOQuery1.Connection.BeginTrans;
ADOQuery1.ExecSQL;
ADOQuery1.Connection.CommitTrans;