【发布时间】:2012-12-10 19:01:25
【问题描述】:
我看到前段时间有人在我学校的另一个学期问过这个问题,哈哈。但他们得到的答案并没有真正让我满意。这是另一个问题的链接:SQL Msg 8114, Level 16, State 5, Procedure sp_product_listing, Line 0 Error converting 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 转换为 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
【问题讨论】:
-
MONTH 和 YEAR 都返回整数。尝试将您的参数设置为整数
-
如上所述,我不理解其他问题中给出的任何答案,因为这是一个学校项目,如果我不明白某些内容,我将无法使用它。 .. 如果描述中不明显,我很抱歉。
-
附注:Microsoft recommends that you avoid the
sp_prefix for your own stored procedures;该前缀保留供 Microsoft 将来使用。此外,使用sp_前缀具有negative performance impacts on your procedures - 只是不要这样做。 -
如果你不理解另一个问题中的建议,是什么让你认为你会理解这个问题中的建议?
标签: sql sql-server datetime error-handling varchar