-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 回答