SQL — неправильный синтаксис рядом с ключевым словом

#sql #syntax

#sql #синтаксис

Вопрос:

Небольшая проблема с моим запросом здесь:

 CREATE VIEW rental_view
AS 
   SELECT 
       m.movie_id, movie_name, co.copy_id, 
       f.format_id, format_name, cu.customer_id, 
       (first_name   ' '   surname) AS customer_name, 
       rental_id, rental_date, return_date, 
       ISNULL(return_date, CAST(DATEDIFF(dd, rental_date, GETDATE() ) AS rental_duration 
   FROM 
         movie AS m 
   INNER JOIN copy AS co ON m.movie_id = co.movie_id
   INNER JOIN format AS f ON co.format_id = f.format_id
   INNER JOIN rental ON co.copy_id = rental.copy_id
   INNER JOIN customer AS cu ON rental.customer_id = cu.customer_id
  

Приводит к ошибке:

Сообщение 156, уровень 15, состояние 1,
Процедура rental_view, строка 3 Неправильный синтаксис рядом с ключевым словом ‘FROM’.

Я долго пытался это сделать и не могу решить.

Ценю помощь.

Ответ №1:

В этой строке не хватает двух круглых скобок:

 AS SELECT 
    m.movie_id, movie_name, co.copy_id, f.format_id, format_name, 
    cu.customer_id, (first_name   ' '   surname) AS customer_name, 
    rental_id, rental_date, return_date, 
    ISNULL(
        return_date, 
        CAST(DATEDIFF(dd, rental_date, GETDATE()))) AS rental_duration 
  

В любом случае ваш синтаксис неправильный в других частях:

  • CAST требуется преобразовать поле, ключевое слово КАК и новый тип (см. Документы)
  • DATEDIFF требуется два параметра (см. Документы) <- это, если вы используете MySQL; с MS-SQL правильно

Комментарии:

1. Где должна быть скобка?

2. @Owen еще два после последнего )

3. @Owen: после GETDATE()) вам нужны еще две круглые скобки, как я написал 😉

4. Чувак, я думаю, что скобка должна быть в конце после rental_duration, потому что приведение будет ожидать, что после него будет AS

5. @AllanChua: нет, скобки должны быть там, где я их помещаю, потому что окончательное значение AS задается для предоставления псевдонима вычисляемому полю. В любом случае, как вы заметили, запрос неверен в других частях, как я написал в своем ответе 🙂

Ответ №2:

попробуйте это:

   CREATE VIEW rental_view
  AS SELECT m.movie_id, 
movie_name, 
co.copy_id, 
f.format_id, 
format_name, 
cu.customer_id, 
(first_name   ' '   surname) AS customer_name, 
rental_id, 
rental_date, 
return_date,
ISNULL(return_date,
CAST(DATEDIFF(dd, rental_date, GETDATE()) AS *type desired here*)) AS name of column
  FROM movie as m 
  INNER JOIN copy AS co
  ON m.movie_id = co.movie_id
  INNER JOIN format AS f
  ON co.format_id = f.format_id
  INNER JOIN rental 
  ON co.copy_id = rental.copy_id
  INNER JOIN customer AS cu
  ON rental.customer_id = cu.customer_id
  

Комментарии:

1. Я думаю, что вы ставите скобки не в том месте. В любом случае я уже дал ответ «вам не хватает круглой скобки» 😉

2. Ваш отредактированный пост по-прежнему неверен: DATEDIFF требуется только два параметра 😉

3. DATEDIFF ( datepart , startdate , enddate ) смотрите ( msdn.microsoft.com/en-us/library/ms189794.aspx )

4. Может быть, приятель, проблема в том, что ребенок не указал, какой сервер он использует, но с параметрами, которые у него есть в функции DATEDIFF, это больше похоже на СЕРВЕР MS SQL

5. Это MS SQL SERVER извините, действительно следовало упомянуть.