2010-04-05 207 views
1

我将一个变量传递给存储过程,我希望proc查看另一个表并获取表的主键并将该值插入表中。Sql server存储过程

Table A: 
pk_id int, 
user varchar 

Table B: 
userKey int 
locationKey int  
Someotherthings varchar 

Table C: 
pk_id int, 
Location varchar 

当调用sp_howto,并通过用户给它,我想它得到表A中pk_id并将其插入到表B中USERKEY。

set @res = select pk_id from TableA where [email protected] 
set @loc = select pk_id from TableC where location = @Location 
insert into tableB (userKey, locationKey) values (@res, @loc) 

工作的呢?和如果我有很多变量我想要这样填充?

+0

目前尚不清楚你所说的“很多关键点”的意思是什么你的意思是你想为许多对表做这个? – egrunin 2010-04-05 19:40:44

+0

我编辑了这个问题。 – DarthVader 2010-04-05 19:49:42

+0

我编辑了我的答案。 – egrunin 2010-04-05 21:56:33

回答

1

问题已经变异了一些 - 目前发布的代码工作正常,这些都是替代品。

的一个语句的方式,在那里你传递两个参数,@user和@location:

INSERT INTO TableB (UserKey, LocationKey) 
SELECT (userKey, LocationKey) 
FROM 
(
    (select pk_id as userKey, user from TableA) x 
    cross join 
    (select pk_id as LocationKey, Location from TableC) y 
    WHERE user = @user and location = @location 
) 

如果用户是否是TableA中独一无二的,地点是在表C独一无二的,这将插入一条记录到TableB中。

编辑补充:

上面会做它在一个单一的声明,但增加的复杂性获得你什么。更好地做到这一点是这样的:

添加唯一密钥表B:

pk_id int IDENTITY 

然后做你插入这样的:

declare @newID int 

INSERT INTO TableB (UserKey) 
SELECT pk_id from TableA where user = @user 

SELECT @newID = SCOPE_IDENTITY() -- retrieves the new key value 

UPDATE TableB set LocationKey = 
    (SELECT pk_id from TableC WHERE location = @location) 
WHERE pk_id = @newID 
+0

我的方法有什么问题,我还没有尝试过,但它会工作吗? – DarthVader 2010-04-06 02:02:36

+0

是的 - 我以为你在寻找替代品。 – egrunin 2010-04-06 02:23:05

+0

很酷。谢谢... – DarthVader 2010-04-06 23:21:21

4

更简洁的语法就是用这样的工作:

INSERT INTO TableB (UserKey) 
SELECT UserKey FROM TableA WHERE User = @User