Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Допустимы ли вложенные INSERT  [new]
siben-2
Guest
Было бы красиво. Две таблицы LINK1 и Words. В Words - слова (нужные мне), в LINK1 - некоторые связи между ними. Вставка пары слов и связей делать одним Sql-запросом с вложенными INSERT. Вставили слово - вернули значение и использовали его в values в внешнем insert.

INSERT INTO LINK1 (id1,id2,rel)
VALUES(
    (INSERT INTO Words (name)
    OUTPUT INSERTED.id
    VALUES ('термин1')),
    ((INSERT INTO Words (name)
    OUTPUT INSERTED.id
    VALUES ('термин2'))
    ,1);


Но не получается. Обидно, output често возвращает значение. Не понял, можно ли так вообще делать или я что-то путаю с синтаксисом.
3 дек 15, 16:45    [18509525]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Glory
Member

Откуда:
Сообщений: 104760
siben-2
Обидно, output често возвращает значение.

output возвращает набор, а не значение
3 дек 15, 16:49    [18509559]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
siben-2
Guest
Glory
siben-2
Обидно, output често возвращает значение.

output возвращает набор, а не значение

Намек, что должно все получиться, если еще и SELECT с этого добавить в запрос?
3 дек 15, 16:55    [18509604]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
siben-2,

такого синтаксиса не существует.
3 дек 15, 17:00    [18509642]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Glory
Member

Откуда:
Сообщений: 104760
siben-2
Намек, что должно все получиться, если еще и SELECT с этого добавить в запрос?

Намек на то, что не надо придумывать ни свои определения, ни свой синтаксис
3 дек 15, 17:00    [18509648]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
siben-2
Guest
Не существует, так не существует. Жаль. Была красивая идея выбирать строчки с нужным SQL-запросом и только параметры подставлять. Споткнулся на insert-ах.
3 дек 15, 17:14    [18509750]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Glory
Member

Откуда:
Сообщений: 104760
siben-2
Была красивая идея выбирать строчки с нужным SQL-запросом и только параметры подставлять. Споткнулся на insert-ах.

Вы споткнулись тогда, когда вдруг 2 записи в одной таблице захотели превратится в одну запись в другой таблице
3 дек 15, 17:22    [18509808]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
siben-2,

универсальный генератор всего и в один запрос? :D Видимо, для взрыва мозга тем, кто этот код будет сопровождать.
3 дек 15, 18:07    [18510093]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
siben-2
Guest
Glory
siben-2
Была красивая идея выбирать строчки с нужным SQL-запросом и только параметры подставлять. Споткнулся на insert-ах.

Вы споткнулись тогда, когда вдруг 2 записи в одной таблице захотели превратится в одну запись в другой таблице


Тут все нормально, я для примера для форума специально укоротил количество значений, а так там есть связи в одной таблице с кучей параметров и термины в другой таблице с определениями, есть и еще несколько таблиц. Все в одну засовывать - это совсем неправильно будет.
3 дек 15, 18:18    [18510143]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Glory
Member

Откуда:
Сообщений: 104760
siben-2
Тут все нормально, я для примера для форума специально укоротил количество значений,

Где же тут ноормально, если
LINK1 (id1,id2) - это Words id1
_______________________id2
3 дек 15, 18:23    [18510166]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
siben-2
Guest
Владислав Колосов
siben-2,

универсальный генератор всего и в один запрос? :D Видимо, для взрыва мозга тем, кто этот код будет сопровождать.

Почему всего-то? Как раз было бы разбито по логическим сущностям: добавить объект, описанный в нескольких таблицах; удалить такой объект; посмотреть информацию о нём и т.д. На каждую по SQL-запросу, исполняемому в обработке ASP.NET страницы. Строки с запросами в одном файле и классе. Обработка - в другом.
3 дек 15, 18:24    [18510167]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
siben-2
Guest
Glory
siben-2
Тут все нормально, я для примера для форума специально укоротил количество значений,

Где же тут ноормально, если
LINK1 (id1,id2) - это Words id1
_______________________id2


Нет. Есть слова, определенные в Words (id, само слово, еще кучка параметров) и есть LINK в котором определены операции (связи) между ними с кучей своих параметров. Есть форма в которой добаляются сразу слова и операции. Мне хотелось одним махом и в таблицу слов занести и в таблицу связей одним запросом. Ну не поддерживает этого T-SQL, ладно, но в самой идее что плохого?
3 дек 15, 18:27    [18510192]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Glory
Member

Откуда:
Сообщений: 104760
siben-2
Нет. Есть слова, определенные в Words (id, само слово, еще кучка параметров) и есть LINK в котором определены операции (связи) между ними с кучей своих параметров.

Еще раз - у вас ошибка в структуре. Из-за которой вы сейчас и придумываете синтаксис своего "вложенного INSERT-а"
3 дек 15, 18:29    [18510202]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
siben-2
На каждую по SQL-запросу, исполняемому в обработке ASP.NET страницы


Вот откуда ветер дует... Категорически неверный подход... Пишите процедуры, не давайте доступа к таблицам.
Если это только не разовая разработка или на скорую руку из-за нехватки времени. Просто архитектурный совет.
возможно, не совсем очевидный для человека, который не писал бизнес-логику на сервере, но, поверьте, он спасет от многих проблем при развитии приложения.
3 дек 15, 18:37    [18510241]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
siben-2
Guest
Glory
siben-2
Нет. Есть слова, определенные в Words (id, само слово, еще кучка параметров) и есть LINK в котором определены операции (связи) между ними с кучей своих параметров.

Еще раз - у вас ошибка в структуре. Из-за которой вы сейчас и придумываете синтаксис своего "вложенного INSERT-а"

Извиняюсь, может туплю под вечер и потому не понимаю, но я обойдусь и без вложенных INSERT, собственно пишу сейчас без них.

Но в чем тут ошибка ошибка в самой структуре, когда вроде просто классика нормальной формы получается? Есть таблица отношений терминов. Есть сама таблица терминов. (и еще некоторые таблицы).
3 дек 15, 18:37    [18510245]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
siben-2
Guest
Владислав Колосов
Если это только не разовая разработка или на скорую руку из-за нехватки времени. Просто архитектурный совет.
возможно, не совсем очевидный для человека, который не писал бизнес-логику на сервере, но, поверьте, он спасет от многих проблем при развитии приложения.

Спасибо. Сейчас это некий прототип, чтобы сделать, посмотреть и решить что дальше с ним будет :)
3 дек 15, 18:43    [18510280]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Glory
Member

Откуда:
Сообщений: 104760
siben-2
Но в чем тут ошибка ошибка в самой структуре, когда вроде просто классика нормальной формы получается? Есть таблица отношений терминов. Есть сама таблица терминов. (и еще некоторые таблицы).

Нормальные формы - это не только правильное количество таблиц, но и правильное количество полей в них
3 дек 15, 19:43    [18510493]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Суть нормализации состоит в устранении избыточности данных. На практике же выбирают некую середину между необходимостью разделения на таблицы и количеством этих таблиц.

К примеру, взять таблица вида
код название тип

Колонка тип является избыточной, если этот тип нужен только для логического разделения записей. В такой ситуации выгодно разделить таблицу а две горизонтально. Некоторые бизнес-задачи требуют классификации типов, в этом случае можно создать справочник типов и сохранить таблицу с тремя колонками, чтобы избежать жесткого кодирования типов в процедуре.

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

Если я понятно выражаюсь :-)

Особенность соло-разработчика приложения в том, что возникает очевидный соблазн - бизнес-логику расположить на клиенте, строить запросы к таблицам из приложения. Так действительно проще, но только разработчику. Как только дело доходит до вопросов безопасности, масштабирования доработок - переписывание клиента обрастает обертками, обертками оберток и становится почти не управляемым.
Более затратно по времени разработки, но имеет меньше недостатков схема, при которой определен программный "интерфейс" со стороны сервера БД - это процедуры и функции для выполнения заданных бизнес операций и клиент работает исключительно с этим "интерфейсом". И для отладки лучше,и для аудита, и для изменений и для реконструкции клиента.
4 дек 15, 00:11    [18511458]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
Зря, конечно, что в T-SQL не легальны конструкции вида
with test_1 (id) as (INSERT INTO Words (name)
    OUTPUT INSERTED.id
    VALUES ('термин1'))
select * from test_1


Вот, к примеру, в PostgreSQL нормально писать такие вот выверты
WITH o AS (
  INSERT INTO site_order (id,status,phone) VALUES (42,2,'+7 (000) 000-00-00')
  RETURNING *
),
item_list (name,amount,cost) AS (VALUES ('name 1', 1, 100), ('name 2', 1, 200), ('name 1', 3, 100)),
item AS (
  INSERT INTO site_order_item (order_id,name,amount,cost)
  SELECT o.id, v.name, v.amount, v.cost FROM o, item_list as v
  RETURNING *
),
detail_list (detail) AS (VALUES ('detail 1'), ('detail 2')),
detail AS (
  INSERT INTO site_order_item_detail (order_item_id, detail)
  SELECT oi.id, v.detail FROM (SELECT * FROM item ORDER BY random() LIMIT 1) as oi, detail_list as v
  RETURNING *
) SELECT 1;
4 дек 15, 11:40    [18512769]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Шыфл,

а почему важно именно так писать?
4 дек 15, 13:02    [18513476]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
Владислав Колосов,

Я не говорю "именно так", но зачем мне OUTPUT, который я не могу тут же использовать? Я понимаю, что есть
OUTPUT INSERTED.* INTO @MyTableVar
, но это ИМХО избыточно. Этом варианте появляются лишние сущности, которые мне по большому счёту не нужны, мне нужно использовать данные, а приходится их сохранять, парясь по поводу переменных и разбивать одну логическую операцию на шаги, оборачивать всё в транзакцию и т.п...
4 дек 15, 14:01    [18513912]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Шыфл,

это эстетика :)
4 дек 15, 14:50    [18514344]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
Владислав Колосов,

именно эстетика, ибо разворачивать и оборачивать приходится всё долго и нудно. Вот простой пример, как это заставить работать без объявления переменных и без создания временных таблиц, с перечислением всех колонок? Короче, не эстетично, дорого и не практично

create table #t (id int identity, name varchar(10))

select * into #tt1 from #t where 0=1
select * into #tt2 from #t where 0=1

SET IDENTITY_INSERT #tt1 ON 
SET IDENTITY_INSERT #tt2 ON 

INSERT INTO #t (name) --НИХРЕНА НЕ РАБОТАЕТ
    OUTPUT INSERTED.* into #tt1
    VALUES ('термин1')
  
INSERT INTO #t (name) --НИХРЕНА НЕ РАБОТАЕТ
    OUTPUT INSERTED.* into #tt2
    VALUES ('термин2')  

select * from #tt1
select * from #tt2

drop table #t
drop table #tt1
drop table #tt2
4 дек 15, 15:26    [18514542]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Шыфл,

вот это нужно, что ли?
declare @t table (id int identity, name varchar(10), param1 int, param2 int)

declare @new1 table ( id int, newname varchar(10), newparam1 int, newparam2 int)

merge @t
	using (select 'value1' name, 100 param1, 200 param2) inp on 0=1
	when not matched then
		insert (name, param1, param2) values (inp.name, inp.param1, inp.param2)
		output inserted.id, inp.name, inp.param1, inp.param2 into @new1
;
select * from @new1
4 дек 15, 16:16    [18514824]     Ответить | Цитировать Сообщить модератору
 Re: Допустимы ли вложенные INSERT  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
Владислав Колосов,

С merge я не сталкивался, интересная конструкция. Но вообще нужно возвратить таблицу inserted(deleted) без объявления переменной и типов столбцов, "как есть" (чтобы работало и при добавлении-удалении столбцов). Чтобы потом с ней как-то работать (курсор, построчные процедуры и тп). Через #table работало бы, если бы не identity...
4 дек 15, 16:56    [18515044]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить