2010-04-05 6 views
1

Je transmets une variable à une procédure stockée. Je souhaite que proc mette en évidence une autre table et récupère la clé primaire de la table et insère cette valeur dans la table.Sql server Stored Procédure

Table A: 
pk_id int, 
user varchar 

Table B: 
userKey int 
locationKey int  
Someotherthings varchar 

Table C: 
pk_id int, 
Location varchar 

Quand j'invoque sp_howto, et passe à l'utilisateur, je veux pour obtenir la PK_ID du tableau A et l'insérer dans le tableau 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) 

Est-ce que cela fonctionne? et et si j'ai beaucoup de variables que je veux remplir comme ça?

+0

Il est pas clair ce que vous entendez par « beaucoup de touches » Est-ce que vous voulez dire que vous voulez faire cela pour de nombreuses paires de tables? – egrunin

+0

J'ai modifié la question. – DarthVader

+0

J'ai édité ma réponse. – egrunin

Répondre

1

La question a muté certains - le code actuellement affiché fonctionne bien, ce sont des alternatives.

La façon dont une déclaration, où l'on passe deux paramètres, @user et @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 
) 

Si si l'utilisateur est unique en TableA et l'emplacement est unique en TableC, ce insérera un enregistrement en TableB.

Edité à ajouter:

ci-dessus fera en une seule déclaration, mais la complexité supplémentaire que vous ne gagne rien. Mieux vaut le faire comme ceci:

Ajouter une clé unique à TableB:

pk_id int IDENTITY 

Ensuite, faites votre insert comme ceci:

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

ce qui ne va pas avec mon approche, je n'ai pas encore essayé, mais cela fonctionnerait-il? – DarthVader

+0

Oui - Je pensais que vous étiez à la recherche d'alternatives. – egrunin

+0

cool. Merci... – DarthVader

2

Cela devrait fonctionner pour une ou plusieurs clés

insert into tableB (userKey) 
select userKey from TableA where [email protected] 
4

La syntaxe plus succincte est d'utiliser quelque chose comme ceci:

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