可能重复:
SQL 消息 8114,级别 16,状态 5,过程 sp_product_listing,第 0 行错误将数据类型 varchar 转换为日期时间
我看到这是前段时间在我学校另一个学期有人问的,哈哈。但他们得到的答案并没有真正让我满意。这是另一个问题的链接:SQL Msg 8114, Level 16, State 5, Procedure sp_product_listing, Line 0 Error convert data type varchar to 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 转换为日期时间时出错。
这是我执行存储过程的方式:
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