2012-06-21 105 views
-1

我創建的SQL以下存儲過程: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號線
從字符 字符串轉換日期和/或時間時轉換失敗。

在此先感謝您的幫助。

+10

沒有月有32天... –

+0

大約一半的人也沒有31天。您應該使用日期算術來獲取一個月的最後日期(開始日期+1個月 - 1天)。此外,YYYY-MM-DD格式是特定於語言環境的。您應該使用DATEFROMPARTS變體之一創建年,月和日的日期,或者YYYYMMDD格式 –

+0

@PanagiotisKanavos - IIRC「YYYY-MM-DD」(ISO)對於投射到「日期」是明確的,但對於「 datetime'。儘管同意你的評論的其餘部分。 –

回答

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