0

datetime の一部をプロシージャ内の変数として使用しようとしているため、パラメーターは「6 月」のような月になります。これが私が書いたものです

/* 3. sp_product_listing というストアド プロシージャを作成し、指定された月と年に注文された指定された製品を一覧表示します。製品と月と年は、ストアド プロシージャの入力パラメーターになります。商品表から商品名、単価、在庫数、仕入先表から仕入先名を表示します。Jack を含む製品名、注文日の月が 6 月、年が 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 を datetime に変換しようとしていますか?

@month MONTH(datetime) などを試しましたが、これにアプローチする方法がわかりませんか? 多分それは問題でさえありませんか?

4

3 に答える 3

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 に答える
0

JuneDateTime値ではありません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

名前タイプが示すように、YYYY/MM/DD hh:mm:ss のような「日付と時刻」の形式のデータが必要であり、「June」はパターン I に適合しないため、「@month」を datetime にしないでください。提示しただけです。日付用の列を 1 つだけ作成する場合は、[dateofsomething] と呼びましょう。その後、通常の日付のような値を持つパラメーター "@date" (datetime 型) を渡すことができます。

もちろん、現在の日付が必要な場合は、 getdate() を使用してください

幸運を

于 2012-12-16T01:08:24.523 に答える