Я работаю над сценарием на 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'))
Будет ли «CROSS JOIN» производить декартовский продукт? Какие преимущества у «CROSS JOIN» над «INNER JOIN»? – buck1112
@ buck1112. , , Это, по-видимому, намерение ваших запросов. Но ваша вставка, вероятно, генерирует только один «id», поэтому декартово произведение не выйдет из-под контроля. –
Обновление: я применил это к моим более крупным тестовым таблицам, и теперь я получаю то, что кажется декартовым продуктом: первая таблица (которая генерирует выходные идентификаторы) имеет 1768 строк, а остальные таблицы имеют 3125824 (1768 квадрат). Это все еще все вставки, без данных, существующих в таблицах перед вставкой. Что было бы хорошим шагом для расследования причины этого нежелательного результата? благодаря – buck1112