powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / заполнение двух таблиц через INSERT OUTPUT INTO
15 сообщений из 15, страница 1 из 1
заполнение двух таблиц через INSERT OUTPUT INTO
    #36766231
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть таблица T_src с исходными данными (без Id), на их основе надо в таблицу T_Id нагенерить нужное число новых Id и заполнить таблицу T_data, где будут храниться сами данные со ссылками на полученные Id. пишу конструкцию INSERT ... OUPTUT INTO ... SELECT ... FROM ... , получаю ошибку на использовании алиаса таблицы из FROM, хотя пример Е намекает, что так делать можно. к тому же, приходится добавлять в таблицу с identity фейковое поле, т.к. непонятно как заставить работать insert default values для вставки нескольких строк

можно ли обойтись одним запросом или придется заполнять T_Id и T_data отдельно?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TABLE T_Id (id int IDENTITY( 1 , 1 ))
CREATE TABLE T_data (id int, txt nvarchar( 100 ))
CREATE TABLE T_src(txt nvarchar( 100 ))

INSERT T_src 
SELECT 'aaa' UNION ALL
SELECT 'bbb' UNION ALL
SELECT 'ccc' UNION ALL
SELECT 'ddd'


ALTER TABLE T_id ADD fake int -- не очень

INSERT T_id
	OUTPUT inserted.id, src.txt -- src.txt не распознает
		INTO T_data
SELECT  1  
FROM T_src AS src

ALTER TABLE T_Id DROP COLUMN fake 
...
Рейтинг: 0 / 0
заполнение двух таблиц через INSERT OUTPUT INTO
    #36766236
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
Microsoft SQL Server  2008  (RTM) -  10 . 0 . 1835 . 0  (Intel X86)   Feb  26   2010   16 : 33 : 39    Copyright (c)  1988 - 2008  Microsoft Corporation  Enterprise Edition on Windows NT  5 . 1  <X86> (Build  2600 : Service Pack  3 ) 
...
Рейтинг: 0 / 0
заполнение двух таблиц через INSERT OUTPUT INTO
    #36766310
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полуофф:
почему для identity заведена отдельная таблица?
почему бы не перенести identity в таблицу T_data?
--------------------------------------------------------------------------------------
по сабжу - если мне не изменяет склероз, то MS SQL не позволяет то что хочет автор
...
Рейтинг: 0 / 0
заполнение двух таблиц через INSERT OUTPUT INTO
    #36766317
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это неявно записно здесь

from_table_name

Is a column prefix that specifies a table included in the FROM clause of a DELETE, UPDATE, or MERGE statement that is used to specify the rows to update or delete.

Как видите INSERT нет в перечисленных командах
...
Рейтинг: 0 / 0
заполнение двух таблиц через INSERT OUTPUT INTO
    #36766379
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паганель,
T_data это история справочника (столбец Id содержит не уникальные значения), а T_Id - таблица с уникальными Id для поддержания целостности за счет FK.
--------------------
жаль, хотел красиво


Glory
да, пропустил этот момент. и непонятно, почему insert является особым случаем
...
Рейтинг: 0 / 0
заполнение двух таблиц через INSERT OUTPUT INTO
    #36766454
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShakillT_data это история справочника (столбец Id содержит не уникальные значения),
а T_Id - таблица с уникальными Id для поддержания целостности за счет FK.Попробуйте взглянуть на историю с другой стороны:
1) В таблицу истории вносить только информацию о фактах изменения записей справочника,
2) Записи справочника, про которые в истории никакой информации нет, считать историей вставок
Другими словами, запрос на получение отчета по истории будет примерно такой:
Код: plaintext
1.
2.
3.
select 'updated', * from t_data
union all
select 'inserted', * from t_id where t_id.id not in
(select t_data.id from t_data where t_data.id is not null)
Подойдет ли такой подход для Вашей задачи - решать Вам

Также рекомендую обратиться в форум Проектирование БД ,
там Вам наверняка еще лучшее что-то предложат
...
Рейтинг: 0 / 0
заполнение двух таблиц через INSERT OUTPUT INTO
    #36766539
Фотография SomewhereSomehow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakillда, пропустил этот момент. и непонятно, почему insert является особым случаем
Насколько я понял, это связано с тем что при update, delete ты можешь указывать дополнительные таблицы в предложении from. типа update tab1 from tab1, tab2 и можно ссылаться в output на поля как tab1, так и tab2. В insert-е такого нет.
Вот с msdn форума
...
Рейтинг: 0 / 0
заполнение двух таблиц через INSERT OUTPUT INTO
    #36766598
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паганель, а какие преимущества имеет то что вы предложили? история справочников мне нужна не для просмотра собственно истории изменений, а для того чтоб можно было посмотреть данные журналов на любой момент времени с учетом того что содержимое справочников могло быть иным
...
Рейтинг: 0 / 0
заполнение двух таблиц через INSERT OUTPUT INTO
    #36766625
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShakillПаганель, а какие преимущества имеет то что вы предложили?Отпадает необходимость что-либо заносить в историю в момент вставки в справочник новой записи

Shakillпосмотреть данные журналов на любой момент времени с учетом того что содержимое справочников могло быть инымПриведенный мною выше пример запроса решает эту задачу?
Если нет, то почему?
...
Рейтинг: 0 / 0
заполнение двух таблиц через INSERT OUTPUT INTO
    #36766674
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SomewhereSomehow, спасибо за ссылку, теперь по OUTPUT вопрос исчерпан

Паганель, дело в том что T_data это одновременно рабочий справочник и его история, т.к. объемы не те, чтобы создавать отдельную таблицу и выносить туда актуальные записи. а в T_id хранятся только Id, на которые ссылаются T_data и таблицы, использующие этот справочник. так что мой вариант проще с точки зрения структуры.
...
Рейтинг: 0 / 0
заполнение двух таблиц через INSERT OUTPUT INTO
    #36766707
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakillобъемы не те, чтобы создавать отдельную таблицу и выносить туда актуальные записиЯ разве предлагал создавать какие-то новые таблицы?

Shakillмой вариант проще с точки зрения структуры.Чем по структуре мой вариант отличается от Вашего?
...
Рейтинг: 0 / 0
заполнение двух таблиц через INSERT OUTPUT INTO
    #36766711
Фотография SomewhereSomehow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakill,
а не хотите проще сделать? раз уж всерно добаляете фейковую колонку, то лучше вместо нее добавить тот же текст и потом его же использовать для вставки в T-data, типа такого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
ALTER TABLE T_id ADD txt nvarchar( 100 )

INSERT T_id(txt)
OUTPUT inserted.id, inserted.txt
INTO T_data(id, txt)
SELECT src.txt
FROM T_src AS src
...
Рейтинг: 0 / 0
заполнение двух таблиц через INSERT OUTPUT INTO
    #36766771
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паганель, вы предлагали сделать в T_Id больше столбцов и использовать ее как хранилище актуальных записей. несколько сложнее, да и в запросах union появляется

SomewhereSomehow, это был упрощенный пример, на самом деле колонок больше, порядка 20-30. для написания скриптов придется активно использовать копипасту, да и сами они станут громоздкими (копирование сначала в T_Id, а потом в T_data), но возможно что так и поступлю
...
Рейтинг: 0 / 0
заполнение двух таблиц через INSERT OUTPUT INTO
    #36766803
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shakillв запросах union появляетсяВ запросах, когда нужна история - да
Но я как-то привык, что для большинства задач нужны как раз актуальные данные, а история нужна реже
Наверное, просто у меня ограниченный опыт разработки, и для Вашей задачи мои советы не подойдут
...
Рейтинг: 0 / 0
заполнение двух таблиц через INSERT OUTPUT INTO
    #36766823
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паганель, конкретно в этой задаче пользователь вводит новые данные и просматривает уже введенные при помощи одних и тех же форм. соотв-но, я решил не разделять запросы "актуальные" и "исторические", а во всех случаях делать привязку к моменту времени, который интересует пользователя
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / заполнение двух таблиц через INSERT OUTPUT INTO
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]