0

我有一个根据传递的标准获取数据的程序。我与@month、@year、@quater 合作得很好。

ALTER PROCEDURE dbo.SPReportTimeSpan
    (
    @Week int = null,
    @Month int = null,
    @Year int = null,
    @Quater int = null
    )
AS
    SET NOCOUNT ON 
    DECLARE @sql nvarchar(4000)

    If (@Week) IS NOT NULL
    BEGIN
        DECLARE @startdate Date, @enddate Date
        EXEC dbo.SPReturnStartEndDateOfSpecifiedWeek  @Week, @startdate OUTPUT, @enddate OUTPUT 
        SELECT @startdate, @enddate
    END

    SELECT @sql='SELECT
    CRMDR.Id as Id,.  
    CRMDR.Request_For_Id as Request_For_Id

    From [CRM].[dbo].[CRM_Doctor_Request] AS CRMDR

    WHERE CRMDR.Is_Deleted=0 '
    If (@Month) IS NOT NULL
        SELECT @sql=@sql + ' AND MONTH(CRMDR.Date_Created) like (@Month)  '
    If (@Year) IS NOT NULL
        SELECT @sql=@sql + ' AND YEAR(CRMDR.Date_Created) like (@Year) '
    If (@Week) IS NOT NULL
        SELECT @sql=@sql + ' AND (CRMDR.Date_Created) BETWEEN (@startdate) AND (@enddate) '
    If (@Quater) IS NOT NULL
        IF (@Quater = 1)
            SELECT @sql=@sql + ' AND MONTH(CRMDR.Date_Created) in (4,5,6) '
        IF (@Quater = 2)
            SELECT @sql=@sql + ' AND MONTH(CRMDR.Date_Created) in (7,8,9) '
        IF (@Quater = 3)
            SELECT @sql=@sql + ' AND MONTH(CRMDR.Date_Created) in (10,11,12) '
        IF (@Quater = 4)
            SELECT @sql=@sql + ' AND MONTH(CRMDR.Date_Created) in (1,2,3) '


    SELECT @sql=@sql + ' ORDER BY CRMDR.Id DESC '

    EXEC sp_executesql @sql, N'@Month int, @Year int, @Quater int', 
                   @Month, @Year, @Quater

    RETURN

但是对于@week,它给出了错误。

Running [dbo].[SPReportTimeSpan] ( @Week = 3, @Month = <NULL>, @Year = <NULL>, @Quater = <NULL> ).

Must declare the scalar variable "@startdate".
Column1                        Column2                        
------------------------------ ------------------------------ 
2013-02-10 00:00:00.0000000    2013-02-17 00:00:00.0000000    
No rows affected.
(1 row(s) returned)
@RETURN_VALUE = 0
Finished running [dbo].[SPReportTimeSpan].

我不明白为什么它不符合周标准。如果有人有想法,请帮忙。

4

3 回答 3

3

@startdate并且@enddate只能在您的IF声明范围内访问:

If (@Week) IS NOT NULL
BEGIN
    DECLARE @startdate Date, @enddate Date
    EXEC dbo.SPReturnStartEndDateOfSpecifiedWeek  @Week, @startdate OUTPUT, @enddate OUTPUT 
    SELECT @startdate, @enddate
END

IF如果您希望在其他地方引用这些变量,请将声明移到语句之外:

DECLARE @startdate Date, @enddate Date
If (@Week) IS NOT NULL
BEGIN        
    EXEC dbo.SPReturnStartEndDateOfSpecifiedWeek  @Week, @startdate OUTPUT, @enddate OUTPUT 
    SELECT @startdate, @enddate
END

仅供参考:您在语句之外引用这些变量的区域在IF这里:

If (@Week) IS NOT NULL
        SELECT @sql=@sql + ' AND (CRMDR.Date_Created) BETWEEN (@startdate) AND (@enddate) '
于 2013-02-21T13:36:35.927 回答
1

我得到了我的问题的解决方案。为了解决这个问题,我需要将日期时间值显式转换为字符类型,以便可以按预期连接查询字符串。

If (@Week) IS NOT NULL
        SELECT @sql=@sql + ' AND (CRMDR.Date_Created) BETWEEN ''' + convert(VARCHAR,@startdate) + ''' AND ''' +convert(VARCHAR,@enddate) + ''''

或者这个(更优化)

SELECT @sql=@sql + ' AND (CRMDR.Date_Created BETWEEN @startdate AND @enddate)'

这需要添加一些东西sp_executesql

EXEC sp_executesql @sql, N'@Month int, @Year int, @Quater int, @Week int, @startdate datetime, @enddate datetime ', 
     @Month, @Year, @Quater, @Week, @startdate, @enddate
于 2013-02-21T15:47:47.167 回答
0

您的变量超出范围

于 2013-02-21T13:51:39.923 回答