2016-10-11 5 views
0

Я пытаюсь вставить строки с данными из 2 таблиц. Первой таблицей являются мои пользователи AspNetUsers и вторая таблица AspNetUserRoles. Я хочу дать всем пользователям ту же роль. Я попытался следующие:SQL INSERT INTO с несколькими SELECTS из разных таблиц

INSERT INTO [MyDB].[dbo].[AspNetUserRoles] ([UserId], [RoleId]) 
    SELECT (SELECT Id FROM [MyDB].[dbo].AspNetUsers) AS UserId, 
(SELECT Id FROM [MyDB].[dbo].[AspNetRoles] WHERE Name = 'Intermediary') AS RoleId 

Я получаю ошибку:

Subquery вернулся более чем на 1 значение. Это недопустимо, если подзапрос следует за =,! =, <, < =,>,> = или когда подзапрос используется как выражение

Это потому, что запрос выбирает всех пользователей, которые я хочу, но мой SQL должен быть изменен для вставки каждого пользователя и того же RoleId.

Думаю, мне, возможно, понадобится использовать курсор или как мне это сделать? Я использую MS SQL Server.

+0

у них есть какие-либо совпадающие поля – TheGameiswar

+0

Почему не следует использовать хранимые процедуры? –

+0

Один из внутренних подзапросов возвращает более одной строки. Пропустите подзапросы, вместо этого подключитесь. – jarlh

ответ

3

Это должно работать:

INSERT INTO [MyDB].[dbo].[AspNetUserRoles] 
    ([UserId], [RoleId]) 
SELECT 
    Id, 
    (SELECT Id FROM [MyDB].[dbo].[AspNetRoles] WHERE Name = 'Intermediary') AS RoleId 
FROM 
    [MyDB].[dbo].AspNetUsers 

до тех пор, как WHERE Name = 'Intermediary' возвращение 1 ряд.

+0

Спасибо, это сработало отлично –

+0

Работает, если предполагается, что для «Intermadiatery» есть только один идентификатор. Небольшое улучшение было бы ... SELECT TOP 1 Id FROM .. во внутреннем select -query. –

+0

Существует только 1 идентификатор для посредника. благодаря –

1

Вот еще один способ

INSERT INTO [MyDB].[dbo].[AspNetUserRoles] 
      ([UserId],[RoleId]) 
SELECT ANU.Id AS [UserId], 
     ANR.Id AS [RoleId] 
FROM [MyDB].[dbo].AspNetUsers ANU 
     CROSS JOIN [MyDB].[dbo].[AspNetRoles] ANR 
WHERE ANR.NAME = 'Intermediary' 
Смежные вопросы