Конференция "Базы" » Зарезервировать ключ перед вставкой [D7, MSSQL]
 
  • TADOCommand (23.04.08 13:53) [0]
    Подскажите как элегантнее поступить в ситуации:

    Требуется сделать по инсерту в две таблицы.
    Первый инсерт должен породить уникальный целочисленный ключ, который потом должен быть использован во втором инсерте. (связь один к одному в общем);

    PS MSSQL2005
  • Ega23 © (23.04.08 13:57) [1]
    В одной транзакции или нет?
  • TADOCommand (23.04.08 13:58) [2]
    в одной
  • TADOCommand (23.04.08 14:01) [3]
    намек на сначала вставить, потом взять идентити таблицы и сделать второй инсерт?
  • TADOCommand (23.04.08 14:04) [4]
    А нету там чо-нить наподобие ораклового returning, чтобы после первого инсерта ключ уже был на клиенте?
  • Ega23 © (23.04.08 14:21) [5]

    > намек на сначала вставить, потом взять идентити таблицы
    > и сделать второй инсерт?
    >


    Конечно.
  • Ega23 © (23.04.08 14:24) [6]
    Ну либо всё разом, оба инсерта. Что-то типа
    declare @x int
    Set NoCount ON
    insert into MasterTable (....) Values (....)
    Set @x = Scope_Identity()
    insert into DetailTable (MasterID, ....) Values (@X, ...)
    Select Result=@x;



    Последний select - это если на клиент получить и спозиционироваться.
  • TADOCommand (23.04.08 14:44) [7]
    ага, понятно. сенкс.
  • Anatoly Podgoretsky © (23.04.08 16:38) [8]
    > Ega23  (23.04.2008 13:57:01)  [1]

    Какая разница?
  • Anatoly Podgoretsky © (23.04.08 16:38) [9]
    > TADOCommand  (23.04.2008 14:01:03)  [3]

    Это не намек, а прямое указание.
  • Ega23 © (23.04.08 16:53) [10]

    > Anatoly Podgoretsky ©   (23.04.08 16:38) [8]
    >
    > > Ega23  (23.04.2008 13:57:01)  [1]
    >
    > Какая разница?


    Ну разница в том, когда получать значение на клиент (и получать ли вообще). Скрипт из [6] без финального select можно одним блоком Execute выполнить.
  • sniknik © (23.04.08 16:58) [11]
    > Скрипт из [6] без финального select можно одним блоком Execute выполнить.
    с финальным тоже, только с open.
  • TADOCommand (23.04.08 16:59) [12]
    не, финальный селект нам не нада.
    прилада вообще не визуальная.
  • TADOCommand (23.04.08 16:59) [13]
    точнее не интерактивная. сервис это 24х7
  • sniknik © (23.04.08 17:00) [14]
    вернее, и с Execute тоже можно, просто чуть больше с ним "телодвижений" чем с open.
  • Ega23 © (23.04.08 17:00) [15]

    > sniknik ©   (23.04.08 16:58) [11]
    >
    > > Скрипт из [6] без финального select можно одним блоком
    > Execute выполнить.
    > с финальным тоже, только с open.
    >


    Не, ну у автора же ник TADOCommand...  :)))
  • Ega23 © (23.04.08 17:01) [16]

    > вернее, и с Execute тоже можно, просто чуть больше с ним
    > "телодвижений" чем с open.


    Можно, только "нафига козе баян?"  :)
  • sniknik © (23.04.08 17:04) [17]
    > Можно, только "нафига козе баян?"  :)
    не знаю, это ты предлагал значение в рекордсете получать. я бы сделал через аутпут параметр.
  • Ega23 © (23.04.08 17:06) [18]

    > не знаю, это ты предлагал значение в рекордсете получать.
    >  я бы сделал через аутпут параметр.


    Старая привычка.
  • ANB (23.04.08 17:10) [19]
    А почему нельзя в одной команде сделать 2 инсерта, не доставая ИД на клиента ?
  • Ega23 © (23.04.08 17:14) [20]

    > А почему нельзя в одной команде сделать 2 инсерта, не доставая
    > ИД на клиента ?


    Кто сказал, что нельзя? Ты ветку-то прочитал?
  • TADOCommand (23.04.08 17:15) [21]
    на клиенте он нужен так как мне его надо тут же отдать во внешнюю систему.
  • ANB (24.04.08 14:27) [22]

    > Ega23 ©   (23.04.08 17:14) [20]
    >
    > > А почему нельзя в одной команде сделать 2 инсерта, не
    > доставая
    > > ИД на клиента ?
    >
    >
    > Кто сказал, что нельзя? Ты ветку-то прочитал?

    Невнимательно.


    > TADOCommand   (23.04.08 17:15) [21]
    > на клиенте он нужен так как мне его надо тут же отдать во
    > внешнюю систему.

    Тогда понятно. См. советы Ega23.
 
Конференция "Базы" » Зарезервировать ключ перед вставкой [D7, MSSQL]
Есть новые Нет новых   [134432   +19][b:0][p:0.001]