-1

SQL で次のストアド プロシージャを作成しました。

CREATE PROCEDURE Sp_generate_report (@YEAR  INT,
                                     @MONTH INT)
AS
    DECLARE @CATEGORY VARCHAR(20)
    DECLARE @BEGIN_DATE DATE
    DECLARE @END_DATE DATE
BEGIN
      SELECT @BEGIN_DATE = Cast(( Cast(@YEAR AS VARCHAR) + '-' 
                         + Cast(@MONTH AS VARCHAR) + '-' + '1' ) AS DATE)

      SELECT @END_DATE = Cast(( Cast(@YEAR AS VARCHAR) + '-' + 
                                Cast(@MONTH AS VARCHAR) + '-' + '32' ) AS DATE)

      SELECT TOP 1 @CATEGORY = Name
      FROM   dbo.Profitible_categories(@BEGIN_DATE, @END_DATE)

      INSERT INTO dbo.MONTHLY_SUMMARY_REPORTS
      VALUES      (@CATEGORY)
  END

プロシージャは正常に作成されましたが、次のコマンドで実行しようとすると:

EXECUTE SP_GENERATE_REPORT 2012, 7

次のエラー メッセージが表示されます。

メッセージ 241、レベル 16、状態 1、プロシージャ SP_GENERATE_REPORT、行 8
文字列から日付や時刻を変換するときに変換に失敗しました。

助けてくれてありがとう。

4

1 に答える 1

4

面倒な文字列の連結や、今月が何月かを推測して最終日を選択することなく、月の最終日を計算できます。

CREATE PROCEDURE dbo.Sp_generate_report
  @YEAR  INT,
  @MONTH INT
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @BEGIN_DATE DATE = DATEADD(MONTH, @MONTH-1, CONVERT(DATE,
    CONVERT(CHAR(4), YEAR) + '0101'));
  DECLARE @END_DATE DATE = DATEADD(DAY, -1, DATEADD(MONTH, 1, @BEGIN_DATE));

  INSERT INTO dbo.MONTHLY_SUMMARY_REPORTS
    SELECT TOP (1) Name
      FROM   dbo.Profitible_categories(@BEGIN_DATE, @END_DATE);
END
GO 
于 2012-06-21T18:59:02.177 に答える