0

尝试在过程中使用部分日期时间作为变量,因此参数将是像“六月”这样的月份。这是我写的

/* 3. 创建一个名为 sp_product_listing 的存储过程,列出在指定月份和年份订购的指定产品。产品和月份和年份将作为存储过程的输入参数。显示产品表中的产品名称、单价和库存数量,以及供应商表中的供应商名称。运行显示包含 Jack 的产品名称的存储过程,订单日期的月份是六月,年份是 2001。存储过程应该产生下面列出的结果集。*/

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

/*Execute procedure*/
EXECUTE sp_product_listing 'Jack','June','2001'

在我添加变量之前,程序测试工作正常,然后它转到 H 试图将 varchar 转换为日期时间?

我已经尝试过@month MONTH(datetime)等。不知道如何解决这个问题?也许这甚至不是问题?

4

3 回答 3

0

June不是一个DateTime值,也不是2001。尝试将一个完整Date的值作为单个值传递,然后添加一个月以确定搜索窗口:

编辑:更新的示例代码。

-- Pass the month and year as a string and an integer.
declare @Month as VarChar(16)
declare @Year as Int

set @Month = 'June'
set @Year = 2001

-- Combine them into a date representing the first day of the desired month and year.
declare @WindowStart as Date = Cast( '1 ' + @Month + Cast( @Year as VarChar(4) ) as Date )

-- Calculate the start of the following month.
declare @WindowEnd as Date = DateAdd( month, 1, @WindowStart )

-- Display the resulting window of dates.
select @WindowStart as WindowStart, @WindowEnd as WindowEnd

比较使用:@WindowStart <= orders.order_date and orders.order_date < @WindowEnd

这将允许优化器在order_date. 这一点的重要性可能会在本学期的后期变得明显。

于 2012-12-16T00:55:08.680 回答
0

您不应该使用“@month”日期时间,因为正如其名称类型所暗示的那样,它需要格式为“日期和时间”的数据,如 YYYY/MM/DD hh:mm:ss,而“June”不适合 I刚刚介绍。如果您只想为日期创建一列,我们将其称为 [dateofsomething],然后,您可以传递一个参数“@date”(类型为 datetime),其值类似于普通日期。

当然,如果你想要当前日期,只需使用 getdate()

祝你好运

于 2012-12-16T01:08:24.523 回答
0

这应该工作

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

/*Execute procedure*/
EXECUTE sp_product_listing 'Jack',6,2001
于 2012-12-16T01:35:40.167 回答