2015-09-18 4 views
0

Я работаю над сценарием на SQL Server 2012 (как backend на странице классического ASP), чтобы выбрать все строки из моей начальной таблицы (aaa_test_ap) и распространять их среди моих трех других таблиц (aaa_test_users , aaa_test_users_positions и aaa_test_users_education).Получение идентификационной информации из вставки/выбора

Я хотел бы получить идентификатор aaa_test_users.ID, как только строка была вставлена ​​в него, для использования в двух других табличных вставках, как их FK (User_ID), в том же запросе.

Возможно ли получить идентификатор с помощью метода INSERT INTO в рамках одного запроса?

Я пробовал использовать SCOPE_Identity(), но он возвращает только последнее значение.

С помощью метода OUTPUT, как бы я использовал значения таблиц, которые он генерирует, так что значения, сгенерированные первым оператором вставки, вставляются в следующие два оператора, каждый в правильной вставленной строке?

Во-первых, таблицы:

CREATE TABLE [dbo].[aaa_test_sp] 
(
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [UserName] [nvarchar](50) NULL, 
    [first_name] [nvarchar](50) NULL, 
    [last_name] [nvarchar](50) NULL, 
    [position] [nvarchar](50) NULL, 
    [phone] [nvarchar](50) NULL, 
    [education] [nvarchar](50) NULL, 
    [ListID] [int] NULL, 

    CONSTRAINT [PK_aaa_test_sp] 
     PRIMARY KEY CLUSTERED ([ID] ASC) 
) ON [PRIMARY] 
GO 

CREATE TABLE [dbo].[aaa_test_users] 
(
    [UserID] [int] IDENTITY(1,1) NOT NULL, 
    [UserName] [nvarchar](50) NULL, 
    [first_name] [nvarchar](50) NULL, 
    [last_name] [nvarchar](50) NULL, 

    CONSTRAINT [PK_aaa_test_users] 
     PRIMARY KEY CLUSTERED ([UserID] ASC) 
) ON [PRIMARY] 
GO 

CREATE TABLE [dbo].[aaa_test_users_positions] 
(
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [UserID] [int] NULL, 
    [position] [nvarchar](50) NULL, 
    [phone] [nvarchar](50) NULL, 

    CONSTRAINT [PK_aaa_test_users_positions] 
     PRIMARY KEY CLUSTERED ([ID] ASC) 
) ON [PRIMARY] 
GO 

CREATE TABLE [dbo].[aaa_test_users_education] 
(
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [UserID] [int] NULL, 
    [education] [nvarchar](50) NULL, 

    CONSTRAINT [PK_aaa_test_users_education] 
     PRIMARY KEY CLUSTERED ([ID] ASC) 
) ON [PRIMARY] 
GO 

Это запрос, я работал на:

--declare @NewUserID nvarchar(50) 
DECLARE @InsertOutput1 table (UserID nvarchar(50)); 

--insert, first, rows from sp to users, and get the autoNumber'ed ID, 
--"NewUserID" 
INSERT INTO aaa_test_users (UserName, first_name, last_name) 
OUTPUT inserted.UserID INTO @InsertOutput1 
    SELECT 
     UserName, first_name, last_name 
    FROM aaa_test_sp 
    WHERE (ListId = '1') 

--select * from @InsertOutput1 
--SELECT SCOPE_IDENTITY() As NewUserID 
--set @NewUserID=(SELECT SCOPE_IDENTITY()) 

--now that the "NewUserID" has been generated, 
--insert it, along with other columns, 
--into the 'users_positions' table. 
--print 'new user id is ' + @NewUserID 
INSERT INTO aaa_test_users_positions (UserID, position, phone) 
    (SELECT 
     @NewUserID, position, phone 
    FROM aaa_test_sp 
    WHERE (ListId = '1') 
    ) 

--now that the "NewUserID" has been generated, 
--insert it, along with other columns, 
--into the 'users_education' table 
--print @NewUserID 
INSERT INTO aaa_test_users_education (UserID, education) 
    (SELECT @NewUserID, education 
    FROM aaa_test_sp 
    WHERE (ListId = '1')) 

ответ

0

Вы присоединяетесь к столу, где новые идентификаторы.

В качестве примера для второй вставки:

INSERT INTO aaa_test_users_positions(UserID, position, phone) 
    SELECT io.UserID, position, phone 
    FROM aaa_test_sp cross join 
     @InsertOutput1 io 
    WHERE ListId = '1'; 

Примечание: учитывая структуру, то, вероятно, только одна строка в @InsertOutput1, так что это не должно производить больше строк, чем ожидалось.

+0

Будет ли «CROSS JOIN» производить декартовский продукт? Какие преимущества у «CROSS JOIN» над «INNER JOIN»? – buck1112

+0

@ buck1112. , , Это, по-видимому, намерение ваших запросов. Но ваша вставка, вероятно, генерирует только один «id», поэтому декартово произведение не выйдет из-под контроля. –

+0

Обновление: я применил это к моим более крупным тестовым таблицам, и теперь я получаю то, что кажется декартовым продуктом: первая таблица (которая генерирует выходные идентификаторы) имеет 1768 строк, а остальные таблицы имеют 3125824 (1768 квадрат). Это все еще все вставки, без данных, существующих в таблицах перед вставкой. Что было бы хорошим шагом для расследования причины этого нежелательного результата? благодаря – buck1112

 Смежные вопросы

  • Нет связанных вопросов^_^