ошибка в операторах множественного выбора в операторе вставки - PullRequest
3 голосов
/ 02 февраля 2011

Я пишу запрос, который содержит несколько операторов выбора в операторе вставки

    INSERT INTO dbo.Products 
    (ProductName, 
     SupplierID, 
     CategoryID, 
     UnitsInStock, 
     UnitsOnOrder, 
     ReorderLevel, 
     Discontinued)
VALUES  
    ('Twinkies' , 
     (SELECT SupplierID FROM dbo.Suppliers WHERE CompanyName = 'Lyngbysild'),
     (SELECT CategoryID FROM dbo.Categories WHERE CategoryName = 'Confections'), 
     0, 
     0, 
     10, 
     0)

На самом деле выдает ошибку

Msg 1046, Level 15, State 1, Line 4
Subqueries are not allowed in this context. Only scalar expressions are allowed.
Msg 102, Level 15, State 1, Line 4
Incorrect syntax near ','.

Где эти два оператора выбора возвращают только одно значение.

Ответы [ 2 ]

7 голосов
/ 02 февраля 2011

Просто измените VALUES на SELECT и удалите внешние скобки.

INSERT INTO dbo.Products 
(ProductName, 
 SupplierID, 
 CategoryID, 
 UnitsInStock, 
 UnitsOnOrder, 
 ReorderLevel, 
 Discontinued)
SELECT  
'Twinkies' , 
 (SELECT SupplierID FROM dbo.Suppliers WHERE CompanyName = 'Lyngbysild'),
 (SELECT CategoryID FROM dbo.Categories WHERE CategoryName = 'Confections'), 
 0, 
 0, 
 10, 
 0

Вам также может понадобиться TOP 1 для подвыражений, но это приведет к другому сообщению об ошибке: подзапрос вернул более одного значения.

0 голосов
/ 02 февраля 2011

Сообщение об ошибке правильное, поскольку

SELECT SupplierID FROM dbo.Suppliers WHERE CompanyName = 'Lyngbysild'

Может (технически) вернуть несколько строк, какую строку он должен отображать в столбце?

Если известно, что этот подзапрос вернет толькоодна строка, затем скажите базе данных, чтобы она заняла первую.

SELECT TOP 1 SupplierID FROM dbo.Suppliers WHERE CompanyName = 'Lyngbysild'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...