Вставить данные в таблицы, связанные с внешним ключом

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

У меня есть 3 таблицы:

Таблица: Клиенты

ID -------LastName-------FirstName-------PhoneNumber

Таблица: Порядок

ID-------Status-------CustomerID

Таблица: OrderLine

ID-------OrderID-------Product-------Quantity-------PricePerUnit

Я запускаю следующий запрос

SqlCommand myCommand2 = 
   new SqlCommand(@"INSERT INTO Order (Status, CustomerID) 
                    VALUES(13016, SELECT ID FROM Customers WHERE FirstName = 'Garderp')", 
                  myConnection);`

и это вызывает исключение

Ошибка синтаксиса рядом с порядком

Как я могу добавить данные в таблицу с внешним ключом в SQL Server 2008, особенно в этом конкретном случае?


person Bip    schedule 13.01.2012    source источник
comment
К вашему сведению, вы можете принять только один ответ :) Я думаю, что у Икара самый полный.   -  person JNK    schedule 13.01.2012


Ответы (5)


Должен быть:

SqlCommand myCommand2 = new SqlCommand(@"INSERT INTO [Order] (Status, CustomerID) " 
   + " SELECT 13016, ID 
       FROM Customers 
       WHERE FirstName = 'Garderp')"
, myConnection);
person Icarus    schedule 13.01.2012
comment
В вашем операторе SQL отсутствует ( - person thang; 24.02.2016

ORDER - зарезервированное ключевое слово в SQL Server (используется в операции ORDER BY).

Это имя необходимо разделить скобками:

"INSERT INTO [Order] (Status, CustomerID) VALUES "

Это заставит SQL Server рассматривать его как имя объекта, а не как ключевое слово.

person JNK    schedule 13.01.2012

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

person Johnny Circle    schedule 13.01.2012

Попробуйте использовать этот запрос

INSERT INTO [Order]
( Status, CustomerID )
SELECT 13016, ID
    FROM Customers
    WHERE FirstName = 'Garderp'
person Kaerber    schedule 13.01.2012

попробуй это

SqlCommand myCommand2 = new SqlCommand(@"INSERT INTO Order (Status, CustomerID) VALUES " + "(13016, SELECT ID FROM Customers WHERE FirstName = \'Garderp\')", myConnection);

если есть более одного клиента с именем "Gardep", этот запрос не будет выполнен. Вам нужно выбрать только одну запись. Здесь будет лучше использовать TOP

SqlCommand myCommand2 = new SqlCommand(@"INSERT INTO Order (Status, CustomerID) VALUES " + "(13016, SELECT TOP 1 ID FROM Customers WHERE FirstName = \'Garderp\')", myConnection);
person Just Me    schedule 13.01.2012
comment
-1 - вы дали 20 ответов и должны знать, как помечать код на этом этапе. - person JNK; 13.01.2012
comment
Также это плохой ответ, поскольку вы не учитываете использование зарезервированного слова в качестве имени таблицы, и TOP 1 отбросит дополнительные результаты, которые могут ему понадобиться. - person JNK; 13.01.2012
comment
если вы не используете верхнюю 1 и есть несколько строк, запрос не будет выполнен. Вы кажетесь новичком. И НЕТ, я не знаю, как форматировать код. Я считаю, что если у вас есть навыки, вам не нужно кормить ложкой - person Just Me; 17.01.2012
comment
На самом деле он не потерпит неудачу, если вы сделаете это SELECT 13016, id from customers, и это еще одна причина, по которой это неправильный ответ - такой подход не подходит для данной проблемы. Теги кода предназначены не для кормления с ложечки, а для того, чтобы код был более читабельным. - person JNK; 17.01.2012