Возможно ли INSERT SELECT коллекцию агрегатных значений, а затем обновить другую таблицу на основе значений @@ IDENTITY только что сделанных вставок? - PullRequest
0 голосов
/ 07 мая 2009

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

У меня есть таблица действий и таблица ActivitySegments. Таблица действий выглядит примерно так:

Activityid (Ident) | actdate (datetime) | Актуация (дата / время) | номер билета (числовой) |

ActivitySegments выглядит примерно так

сегментированный (идент.) | тикетид (числовой) | Activityid (числовой) | дата начала | время начала | конец | конечное время

Это функция отслеживания времени в интрасети. «Старый способ» состоит в использовании таблицы активности. Они хотят иметь возможность отслеживать отдельные сегменты работы в течение дня с помощью механизма запуска / остановки и делать так, чтобы они сворачивались в записи в таблице действий. Вариант использования: пользователь должен иметь возможность выбрать любые / все сегменты, с которыми он работал в этот день, и сгруппировать их по ticketid и вставить в таблицу действий. У меня это работает. Я посылаю строку значений, разделенных запятыми, которые соответствуют сегментам, в sproc, который помещает их во временную таблицу. Итак, у меня есть две вышеупомянутые таблицы и временная таблица с одним столбцом соответствующих сегментид. Разве они все не могут ужиться друг с другом?

Мне нужно взять эти переданные идентификаторы сегмента активности, сгруппировать их по номеру билета и суммировать продолжительность, отработанную для каждого билета (у меня уже есть sql для этого). Затем вставьте этот набор данных в таблицу действий, НО также получите новый идентификатор действия @@ и обновите таблицу действий с соответствующим значением.

В процедурном программировании я бы зациклил вставку, получил бы @@ тождество и сделал бы что-то еще, чтобы выяснить, какие сегментиды пошли на создание этого Activityid. Я почти уверен, что думаю обо всем этом неправильно, но приближается крайний срок, и я два дня смотрел на студию управления SQL, потратил впустую листы бумаги и прожег слишком много сигарет. Я вижу SQL для умников в ближайшем будущем, до тех пор, может ли кто-нибудь мне помочь?

Ответы [ 2 ]

3 голосов
/ 07 мая 2009

попробуйте этот подход:

declare @x table (tableID int not null primary key identity (1,1), datavalue varchar(10) null)
INSERT INTO @x values ('one')
INSERT INTO @x values ('aaaa')
INSERT INTO @x values ('cccc')

declare @y table (tableID int not null primary key               , datavalue varchar(10) null)

declare @count int ---------------FROM HERE, see comment
set @count=5;
WITH hier(cnt) AS
        (
        SELECT  1 AS cnt
        UNION ALL
        SELECT  cnt + 1
        FROM    hier
        WHERE    cnt < @count
        ) -----------------------To HERE, see comment
INSERT INTO @x
    (datavalue)
    OUTPUT INSERTED.tableID, INSERTED.datavalue
    INTO @y
SELECT
    'value='+CONVERT(varchar(5),h.cnt)
    FROM hier  h
    ORDER BY cnt DESC


select '@x',* from @x  --table you just inserted into
select '@y',* from @y  --captured data, including identity

здесь вывод SELECT

     tableID     datavalue
---- ----------- ----------
@x   1           one
@x   2           aaaa
@x   3           cccc
@x   4           value=5
@x   5           value=4
@x   6           value=3
@x   7           value=2
@x   8           value=1

(8 row(s) affected)

     tableID     datavalue
---- ----------- ----------
@y   4           value=5
@y   5           value=4
@y   6           value=3
@y   7           value=2
@y   8           value=1

«ОТ ЗДЕСЬ» - «ЗДЕСЬ» - это просто модный способ создать таблицу, к которой можно присоединиться, вы можете использовать свою собственную таблицу, чтобы присоединиться к ней ...

используйте @y для обработки обновлений, обновления и присоединения к нему в ...

0 голосов
/ 07 мая 2009

Может быть сложно реализовать случай (1) вставки диапазонов и (2) использования сгенерированных ими значений идентичности.

Один из подходов состоит в том, чтобы иметь какой-то столбец отслеживания в таблице, который генерирует Id. Так, например, добавьте TransactionGUID (uniqueidentifier) ​​или что-то в таблицу, которая генерирует идентичность, которую вы хотите захватить. Когда вы действительно вставляете набор строк в эту таблицу, вы задаете заданный GUID, а затем можете собрать набор значений идентификаторов после завершения вставки.

Другой распространенный подход заключается в том, чтобы итеративно, как вы упомянули. Возможно, есть лучший способ создать то, что вы хотите сделать, но если вы должны использовать свой текущий подход (и если я правильно понимаю, что вы делаете), то добавление TransactionGUID может быть самым простым исправлением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...