Сообщение 8114, уровень 16, состояние 5, процедура sp_product_listing, строка 0 Ошибка преобразования типа данных varchar в datetime

Возможный дубликат:
SQL Msg 8114, уровень 16, состояние 5, процедура sp_product_listing, строка 0 Ошибка при преобразовании типа данных varchar в datetime

Я видел, что кто-то недавно задал этот вопрос в другом семестре в моей школе, ха-ха. Но ответ, который они получили, меня не очень удовлетворил. Вот ссылка на другой вопрос: SQL Msg 8114, уровень 16, состояние 5, процедура sp_product_listing, строка 0 Ошибка при преобразовании типа данных varchar в datetime.

Большая часть того, что говорит ответ, не имеет для меня большого смысла, поскольку я очень новичок в SQL. Если бы мы могли открыть еще одну дискуссию по этому вопросу, было бы здорово. Особенно за вычетом издевательств над учителями, которые в последнее время происходят в моих вопросах...

Следующий оператор завершается успешно, НО:

CREATE PROCEDURE sp_product_listing
(
     @product varchar(30),
     @month   datetime,
     @year    datetime
)
AS
  SELECT
     'product_name' = products.name,
     products.unit_price,
     products.quantity_in_stock,
     'supplier_name' = suppliers.name
  FROM
     suppliers
  INNER JOIN
     products ON suppliers.supplier_id = products.supplier_id
  INNER JOIN
     order_details ON products.product_id = order_details.product_id
  INNER JOIN
     orders ON order_details.order_id = orders.order_id
  WHERE
     products.name = @product 
     AND MONTH ('orders.order_date') = @month 
     AND YEAR ('orders.order_date') = @year;
GO

Когда я пытаюсь выполнить процедуру, я получаю сообщение об ошибке:

Сообщение 8114, уровень 16, состояние 5, процедура sp_product_listing, строка 0
Ошибка преобразования типа данных varchar в datetime.

Вот как я выполняю хранимую процедуру:

EXECUTE sp_product_listing @product = 'Jack%', @month = 'June', @year = 2001;
GO

Я попытался изменить два типа данных datetime на varchars, и это не сработало, потому что сам столбец изначально имеет тип данных datetime. Я не уверен, что мне здесь не хватает?

ОБНОВИТЬ:

Это было окончательное решение, основанное на https://stackoverflow.com/users/1554034/valex.

CREATE PROCEDURE sp_product_listing
(
   @product  varchar(30),
   @month    int,
   @year     int
)
AS
   SELECT               
      'product_name' = products.name,
      products.unit_price,
      products.quantity_in_stock,
      'supplier_name' = suppliers.name
   FROM
      suppliers
   INNER JOIN
      products ON suppliers.supplier_id = products.supplier_id
   INNER JOIN 
      order_details ON products.product_id = order_details.product_id
   INNER JOIN 
      orders ON order_details.order_id = orders.order_id
   WHERE
      products.name LIKE @product 
      AND MONTH (orders.order_date) = @month 
      AND YEAR (orders.order_date) = @year;
  GO

Кроме того, для тех, кто все еще читает, вот решение, которое дал мне мой учитель, которое дает те же результаты.

CREATE PROCEDURE sp_product_listing
(
@product    varchar(30),
@month      varchar(10),
@year       char(4)
)
AS
    SELECT
       'product_name' = products.name,
       products.unit_price,
       products.quantity_in_stock,
       'supplier_name' = suppliers.name
    FROM
       suppliers
    INNER JOIN
       products ON suppliers.supplier_id = products.supplier_id
    INNER JOIN
       order_details ON products.product_id = order_details.product_id
    INNER JOIN
       orders ON order_details.order_id = orders.order_id
    WHERE   
       products.name LIKE @product 
       AND DATENAME(MONTH,orders.order_date) = @month 
       AND YEAR (orders.order_date) = @year;
   GO

person isolatedhowl    schedule 10.12.2012    source источник
comment
МЕСЯЦ и ГОД возвращают целые числа. попробуйте сделать ваши параметры целыми   -  person StevieG    schedule 10.12.2012
comment
Как я уже говорил выше, я не понимаю ни одного из ответов, данных в другом вопросе, и, поскольку это школьный проект, если я чего-то не понимаю, я не могу его использовать... Извините, если это не было очевидно в описании.   -  person isolatedhowl    schedule 10.12.2012
comment
В качестве примечания: Microsoft рекомендует избегайте префикса sp_ для собственных хранимых процедур; этот префикс зарезервирован для будущего использования Microsoft. Кроме того, использование префикса sp_ имеет негативное влияние на производительность ваших процедур — просто не делайте этого.   -  person marc_s    schedule 11.12.2012
comment
Если вы не понимаете предложения в другом вопросе, почему вы думаете, что поймете предложения в этом вопросе?   -  person Timmy O'Mahony    schedule 11.12.2012


Ответы (2)


Вы получаете эту ошибку из-за того, что «июнь» не является значением DATEIME и МЕСЯЦ функция возвращает int. Также, если вы вводите @product как MASK (с '%'), вы должны использовать LIKE вместо = Таким образом, вы должны объявить свою процедуру как:

CREATE PROCEDURE    sp_product_listing
(
@product    varchar(30),
@month      int,
@year       int
)

....
WHERE               products.name LIKE @product AND
....

И назовите это

EXECUTE             sp_product_listing @product = 'Jack%', @month = 6, @year = 2001;
person valex    schedule 10.12.2012
comment
Я попробовал это, но получил эту ошибку: Msg 241, уровень 16, состояние 1, процедура sp_product_listing, строка 8 Преобразование не удалось при преобразовании даты и/или времени из символьной строки. - person isolatedhowl; 10.12.2012
comment
Почему вы называете MONTH ('orders.order_date') с ', просто используйте MONTH (orders.order_date). В вашем случае MONTH пытается преобразовать STRING 'orders.order_date' в дату. - person valex; 10.12.2012
comment
ОМГ это было. Jeeeeeze SQL может быть хитрым! Большое спасибо! - person isolatedhowl; 10.12.2012

Представляется, что здесь есть ряд проблем.

Я предполагаю, что столбец orders.order_date имеет тип datetime. Поэтому результатом функций MONTH (orders.order_date) и YEAR (orders.order_date) будут целые числа.

Это означает, что если вы хотите, чтобы строки

MONTH (orders.order_date) = @month AND
YEAR (orders.order_date) = @year;

чтобы работать осмысленно, ваши параметры @month и @year должны быть целыми числами.

Кроме того, похоже, что вы передаете @product с подстановочным знаком, который имеет смысл только для LIKE, а не = в предложении where.

И, наконец, не уверен, почему вы цитируете 'orders.order_date' в вызовах функций - я не думаю, что цитирование необходимо.

Я предлагаю вам внести это изменение:

CREATE PROCEDURE    sp_product_listing
(
@product    varchar(30),
@month      int,
@year       int
)
AS
...
WHERE       products.name LIKE @product
...
            MONTH (orders.order_date) = @month AND
            YEAR (orders.order_date) = @year;

и вызовите EXEC следующим образом:

EXECUTE sp_product_listing @product = 'Jack%', @month = 6, @year = 2001;
GO

Несмотря на вышесказанное и в отношении непосредственной ошибки, которую вы получаете:

В определении процедуры они определены как имеющие тип datetime, что означает, что при вызове процедуры механизм SQL будет ожидать получения для них значений datetime.

В дополнение к этому, то, как вы запускаете EXEC, вы пытаетесь передать значения в @month и @year, которые представляют только компоненты месяца и года даты (соответственно), тогда как механизм SQL ожидает действительные (т.е. полные) даты .

Ошибка, которую вы получаете, - это просто механизм SQL, жалующийся на то, что он не может интерпретировать ваше входное значение 'June' как действительную полную дату (и то же самое для попытки интерпретировать 2001 как действительную полную дату)

person Chamila Chulatunga    schedule 10.12.2012
comment
Хорошо, а что мне делать вместо этого? Я работал над этим часами. - person isolatedhowl; 10.12.2012
comment
@isolatedhowl - пожалуйста, посмотрите последнее редактирование, чтобы узнать, что нужно изменить. - person Chamila Chulatunga; 10.12.2012