0
我正在使用SQL Server 2012中的脚本(作为后端到传统ASP页面)从我的初始表(aaa_test_ap
)中选择所有行并将它们分配到我的3个其他表中(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',所以笛卡尔的产品不会失控。 –
更新:我已经将它应用到我的更大的测试表中,现在我得到了似乎是笛卡尔积的东西:第一个表(它生成输出ID)有1768行受到影响,而其他表中每个表都有3125824(1768平方)行受到影响。这些仍然是全部插入,在插入之前表中没有数据存在。调查这种不良结果的原因是一个好的步骤?谢谢 – buck1112