2016-10-11 3 views
0

Ich versuche, Zeilen mit Daten aus 2 Tabellen einzufügen. Die erste Tabelle ist meine Benutzer AspNetUsers und die zweite Tabelle AspNetUserRoles. Ich möchte allen Benutzern die gleiche Rolle geben. Ich habe folgendes versucht:SQL INSERT INTO mit mehreren SELECTS aus verschiedenen Tabellen

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 

ich den Fehler:

Unterabfrage gab mehr als 1 Wert. Dies ist nicht zulässig, wenn die Unterabfrage folgt =,! =, <, < =, oder = wenn die Unterabfrage als Ausdruck verwendet wird aber mein SQL muss geändert werden, um jeden Benutzer und dieselbe RoleId einzufügen.

Ich denke, ich könnte einen Cursor verwenden müssen, oder wie soll ich darüber gehen? Ich benutze MS SQL Server.

+0

haben sie passende Felder – TheGameiswar

+0

Warum sollten Sie nicht gespeicherte Prozedur verwenden? –

+0

Eine der inneren Unterabfragen gibt mehr als eine Zeile zurück. Überspringe die Unterabfragen, mach stattdessen Joins. – jarlh

Antwort

3

sollte diese Arbeit:

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

solange WHERE Name = 'Intermediary' Rückkehr 1 Reihe.

+0

Danke, das hat perfekt funktioniert –

+0

Funktioniert, wenn angenommen wird, dass es nur eine Id für "Intermediatery" gibt. Kleine Verbesserung wäre .... SELECT TOP 1 ID FROM .. bei der inneren Auswahl-Abfrage. –

+0

Es gibt nur 1 ID für Vermittler. Vielen Dank –

1

ist hier eine andere Art und Weise

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'