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

#sql #sql-server #subquery #dml

#sql #sql-сервер #подзапрос #dml

Вопрос:

У меня есть Dashboard_Diagram таблица:

 CREATE TABLE Dashboard_Diagram
(
    diagram_id TINYINT,
    name VARCHAR(50)
)

INSERT INTO Dashboard_Diagram
    SELECT 1, 'Radar'
    UNION ALL
    SELECT 2, 'Bar'
    UNION ALL
    SELECT 3, 'Pie'
 

У меня есть Dashboard_Configuration таблица:

 CREATE TABLE SomeTable
(
    user_id UNIQUEIDENTIFIER,
    diagram_id TINYINT
)
 

И @user_id :

 DECLARE @user_id UNIQUEIDENTIFIER = 'E4F77F2C-8AA1-493A-94A3-03EA212453D4'
 

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

 INSERT INTO Dashboard_Configuration
@userId, 1
. . . 
 

Я пробовал:

 INSERT INTO Dashboard_Configuration
@user_id, (SELECT diagram_id FROM Dashboard_Diagram)
 

Но это выдает ошибку, потому что подзапрос возвращает более одного значения:

Сообщение 512, уровень 16, состояние 1, строка 7
Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует =, !=, <, <= , >, >= или когда подзапрос используется как выражение.

Как я могу вставить в таблицу на основе динамического количества строк из другой таблицы?

Ответ №1:

Использование insert . . . select :

 INSERT INTO Dashboard_Configuration (User_id, name)
    SELECT @user_id, name
    FROM Dashboard_Diagram;
 

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

Редактировать:

Существует конфликт типов выше. Вы действительно намерены это сделать?

 INSERT INTO Dashboard_Configuration (User_id, diagram_id)
    SELECT @user_id, dd.diagram_id
    FROM Dashboard_Diagram dd;
 

Комментарии:

1. Если мы всегда вставляем все столбцы, почему это неявно плохая практика?

2. @AugustWilliams . . . Вещи ломаются, когда вы добавляете, перемещаете или меняете тип столбцов.

3. Ах, это имело бы смысл.