2009-09-26 9 views
0

Je veux exécuter cette requête:SQL Server Insérer problème de requête

INSERT INTO [Order] (FactorId, ProductId, Entity) 
VALUES((SELECT Top 1 FactorId FROM Factor WHERE UserId = @UserId AND Status = -1), @ProductId, @Entity) 

mais l'erreur suivante se produit:

Les sous-requêtes ne sont pas admis dans ce contexte . Seules les expressions scalaires sont autorisées.

Répondre

4

Essayez

INSERT INTO [Order] (FactorId, ProductId, Entity) 
SELECT Top 1 FactorId, @ProductId, @Entity FROM Factor WHERE UserId = @UserId AND Status = -1 
0
INSERT INTO [Order] (FactorId, ProductId, Entity) 
SELECT (select Top 1 FactorId FROM Factor WHERE UserId = @UserId AND Status = -1), 
@ProductId, @Entity 
+0

J'ai exécuté cette requête, mais l'erreur suivante se produit: La liste de sélection de l'instruction INSERT contient peu articles que la liste d'insertion. Le nombre de valeurs SELECT doit correspondre au nombre de colonnes INSERT. –

0

essayer avec cette

INSERT INTO [Order] (FactorId, ProductId, Entity) 
(SELECT Top 1 FactorId, @ProductId, @Entity FROM Factor 
WHERE UserId = @UserId AND Status = -1) 

Remarque: Insérer une requête avec sélection permettra pas VALEURS mot-clé :).

0

si vous avez d'autres colonnes impliquées, éviter le total TOP 1 et envisager quelque chose comme ça ...

INSERT INTO [Order] (FactorId, ProductId, Entity) 
SELECT FactorId, @ProductId, @Entity FROM Factor 
WHERE UserId = @UserId 
    AND Status = -1 
    and timestamp = (select max(timestamp) from Factor where UserId = @UserId AND Status = -1) 

Ce concept fonctionne aussi si vous avez un ordre de tri colonne ou toute autre colonne unique

+0

Il existe d'autres meilleures réponses. Ceci est plus compliqué et a le risque d'insérer des multiples lorsque max (timestamp) n'est pas unique – RichardTheKiwi

Questions connexes