Возможный дубликат:
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
sp_
для собственных хранимых процедур; этот префикс зарезервирован для будущего использования Microsoft. Кроме того, использование префиксаsp_
имеет негативное влияние на производительность ваших процедур — просто не делайте этого. - person marc_s   schedule 11.12.2012