sql存储过程执行命令

时间:2012-06-21 18:45:00

标签: sql-server tsql stored-procedures

我在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

我收到此错误消息:

  

Msg 241,Level 16,State 1,Procedure SP_GENERATE_REPORT,Line 8
  从字符转换日期和/或时间时转换失败   字符串。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分: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