Конференция "Базы" » Как правильно создавать таблицу? [D7, MSSQL]
 
  • ocean (29.12.09 12:15) [0]
    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 "в базе уже есть объект с таким именем". Как это делать правильно?
  • Медвежонок Пятачок © (29.12.09 12:20) [1]
    сказано же что есть уже такой объект
  • Медвежонок Пятачок © (29.12.09 12:22) [2]
    Как это делать правильно?

    Правильно - это не писать таких конструкций

    try
    ...
    except
    end;
  • Ega23 © (29.12.09 12:26) [3]

    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;

  • ocean (29.12.09 12:35) [4]
    Значит, реализация SQL в Delphi7 мягко говоря неполная?
  • Медвежонок Пятачок © (29.12.09 12:36) [5]
    мда. глубокая мысль.
  • Медвежонок Пятачок © (29.12.09 12:40) [6]
    реализация SQL в Delphi7 мягко говоря неполная?

    Я бы сказал еще категоричнее.
    В делфи вообще нет никакой реализации SQL.
  • ocean (29.12.09 12:47) [7]
    > Ega23 ©   (29.12.09 12:26) [3]
    а если таблица уже есть, а я хочу изменить столбцы, alter table? Логичнее
    drop
    create table
    Да и пробовал я это. ExecSQL ругается на несколько операций в 1 запросе.
    > В делфи вообще нет никакой реализации SQL.
    Но ведь каждый делает ЭТО. А ты как создаешь таблицы?
  • Медвежонок Пятачок © (29.12.09 12:50) [8]
    Но ведь каждый делает ЭТО.

    Это еще не значит, что реализация языка SQL находится в делфи.
  • Медвежонок Пятачок © (29.12.09 12:52) [9]
    На второй execsql выдает general exception "в базе уже есть объект с таким именем". Как это делать правильно?

    не вызывать create table если создаваемая таблица уже есть в базе данных.
  • 12 © (29.12.09 12:58) [10]
    просто таблица "жива еще". Надо как-то подтвердить 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
    следующие команды будут в другом пакете, и для них таблицы уже не будет
  • Медвежонок Пятачок © (29.12.09 13:03) [11]
    для начала полезно будет просто убрать обработку трай/эксепт в таком дурацком исполнении.
  • ocean (29.12.09 13:16) [12]
    > убрать обработку трай/эксепт в таком дурацком исполнении
    Ну при чем тут try? Похоже, ты мастеришь таблицы в management studio.
    > просто таблица "жива еще".
    Вот это правильно! Но 'Go' ExecSQL не берет ни в каком виде. Неверная stored-процедура, неверный синтаксис если после if exists.
  • Sergey13 © (29.12.09 13:16) [13]
    > [7] ocean   (29.12.09 12:47)
    > Но ведь каждый делает ЭТО.

    Наверное я неправильный совсем. Ни разу не создавал таблицы из своих программ.
  • 12 © (29.12.09 13:17) [14]
    потому что нет такой команды как go :)
  • Ega23 © (29.12.09 13:24) [15]

    > Вот это правильно! Но 'Go' ExecSQL не берет ни в каком виде.
    >  Неверная stored-процедура, неверный синтаксис если после
    > if exists.


    команда GO - суть разделитель транзакций в MSSQL.
  • sniknik © (29.12.09 13:28) [16]
    > Ну при чем тут try? Похоже, ты мастеришь таблицы в management studio.
    еще одна глубокая мысль...

    try тут не причем, причем тут "срезанный" им эксепт который мог бы тебе объяснить почему команда на удаление не сработала.
  • Ega23 © (29.12.09 13:33) [17]

    > Наверное я неправильный совсем. Ни разу не создавал таблицы
    > из своих программ.


    Ну пуркуа бы и не па?
    Просто аккуратно надо этим пользоваться, вот и всё.
  • ocean (29.12.09 13:50) [18]
    > причем тут "срезанный" им эксепт
    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 ...
    Результат не меняется. Ребята, вы очень глубокомысленны, но вопрос-то простой?
  • 12 © (29.12.09 13:51) [19]
    да ладно, на :)
    ADOQuery1.SQL.Text:='drop table table1'
    ADOQuery1.Connection.BeginTrans;
    ADOQuery1.ExecSQL;
    ADOQuery1.Connection.CommitTrans;
 
Конференция "Базы" » Как правильно создавать таблицу? [D7, MSSQL]
Есть новые Нет новых   [134435   +33][b:0][p:0.001]