为表中的每一行插入相关行并将它们链接在一起的最简单方法?

时间:2012-02-17 10:02:07

标签: sql sql-server

Car中为每位用户插入Users并将用户CarID设置为已插入ID的{​​{1}}的最简单方法是什么?

Car

很抱歉,如果这可能是一个重复的问题,但我找不到任何简单的解决方案。我发现的一切都是使用复杂的游标,指针等。

这种简单且可重复使用的语法可以在系统升级等过程中迁移数据时节省时间。

3 个答案:

答案 0 :(得分:1)

如果您使用的是SQL Server 2008或更高版本,则可以使用合并并输出类似的内容。

样本表和数据:

declare @Users table
(
  ID int identity primary key,
  Name varchar(10) not null,
  CarID int null
);

declare @Cars table
(
  ID int identity primary key,
  Name varchar(10) not null
);

insert into @Users(Name) values ('User1'),('User2'),('User3');

为每个用户添加一个小心,并将自动生成的CarID移回用户。

declare @ID table(CarID int, UserID int)

merge @Cars as C
using @Users as U
on 0 = 1
when not matched then
  insert (Name) values ('CarName')
output inserted.ID, U.ID into @ID;

update U
set CarID = I.CarID
from @Users as U
  inner join @ID as I
    on U.ID = I.UserID 

SE Data上试用。

可以找到有关合并/输出技巧的更多信息here

答案 1 :(得分:0)

我假设你正在使用的代码让你调用存储过程?

create procedure dbo.CarUserInsert_sp
(
@p_UserID int,
@p_UserName varchar(100),
@p_CarID int,
@p_CarName  varchar(100)
)
as

if not exists ( select 1 from Cars where ID = @p_CarID )
  insert Cars values ( @p_CarID, @p_CarName )

if exists (select 1 from Users where ID = @p_UserID )
  update Users set Name = @p_UserName, CarID = @p_CarID where ID = @p_UserID
else 
  insert Users values ( @p_UserID, @p_UserName,  @p_CarID )

go

答案 2 :(得分:0)

试试这个:

insert into cars (name)
select distinct(name) from users

update user 
set carId = (select ID from cars where cars.name=user.Name)