Установить основанную вставку в две таблицы с отношением от 1 до 0-1 - PullRequest
1 голос
/ 18 июня 2009

У меня есть две таблицы, первая имеет первичный ключ, который является идентификатором, вторая имеет первичный ключ, которого нет, но этот ключ имеет ограничение внешнего ключа обратно к первичному ключу первой таблицы.

Если я вставляю одну запись за раз, я могу использовать Scope_Identity, чтобы получить значение для pk, только что вставленного в таблицу 1, которое я хочу вставить во вторую таблицу.

Моя проблема в том, что у меня много записей, поступивших от избранных, которые я хочу вставить в обе таблицы. Я не смог придумать, как выполнить эти вставки на основе набора.

Мое текущее решение - использовать курсор, вставить в первую таблицу, получить ключ с помощью scope_identity, вставить во вторую таблицу, повторить.

Мне не хватает решения без курсора?

Ответы [ 2 ]

2 голосов
/ 18 июня 2009

Да, посмотрите предложение вывода в Книгах онлайн.

0 голосов
/ 19 июня 2009

У меня была эта проблема только на этой неделе: кто-то ввел в схему таблицу с бессмысленным суррогатным ключом, где, естественно, используются ключи. Без сомнения, я исправлю это в ближайшее время :) до тех пор я работаю над этим, создавая таблицу данных для INSERT из: это может быть постоянная или временная базовая таблица или производная таблица (см. Ниже), которая должно соответствовать вашему желанию решения на основе множества в любом случае. Используйте соединение между этой таблицей и таблицей со столбцом IDENTITY в натуральном ключе, чтобы найти автоматически сгенерированные значения. Вот краткий пример:

CREATE TABLE Test1 
(
 surrogate_key INTEGER IDENTITY NOT NULL UNIQUE, 
 natural_key CHAR(10) NOT NULL CHECK (natural_key NOT LIKE '%[^0-9]%') UNIQUE
);

CREATE TABLE Test2
(
 surrogate_key INTEGER NOT NULL UNIQUE
    REFERENCES Test1 (surrogate_key), 
 data_col INTEGER NOT NULL
);

INSERT INTO Test1 (natural_key)
SELECT DT1.natural_key
  FROM (
        SELECT '0000000001', 22
        UNION ALL 
        SELECT '0000000002', 55
        UNION ALL 
        SELECT '0000000003', 99
       ) AS DT1 (natural_key, data_col);

INSERT INTO Test2 (surrogate_key, data_col)
SELECT T1.surrogate_key, DT1.natural_key
  FROM (
        SELECT '0000000001', 22
        UNION ALL 
        SELECT '0000000002', 55
        UNION ALL 
        SELECT '0000000003', 99
       ) AS DT1 (natural_key, data_col)
       INNER JOIN Test1 AS T1
          ON T1.natural_key = DT1.natural_key;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...