Sql server 自定义程序中的错误“;必须声明标量变量@startdate“;

Sql server 自定义程序中的错误“;必须声明标量变量@startdate“;,sql-server,database,date,Sql Server,Database,Date,我有一个按照通过的标准获取数据的过程。我在月、年、季都能很好地工作 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

我有一个按照通过的标准获取数据的过程。我在月、年、季都能很好地工作

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].
正在运行[dbo].[SPReportTimeSpan](@Week=3、@Month=、@Year=、@Quater=)。
必须声明标量变量“@startdate”。
第1栏第2栏
------------------------------ ------------------------------ 
2013-02-10 00:00:00.0000000    2013-02-17 00:00:00.0000000    
没有受影响的行。
(返回1行)
@返回值=0
已完成运行[dbo].[SPReportTimeSpan]。

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

@startdate
@enddate
仅可在您的
声明的范围内访问,前提是
声明:

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) '

@startdate
@enddate
只能在
语句的范围内访问:

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) '

你的变量是。

你的变量是。

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

If (@Week) IS NOT NULL
        SELECT @sql=@sql + ' AND (CRMDR.Date_Created) BETWEEN ''' + convert(VARCHAR,@startdate) + ''' AND ''' +convert(VARCHAR,@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

我找到了解决问题的办法。为了解决这个问题,我需要显式地将datetime值转换为字符类型,以便查询字符串可以按预期进行连接

If (@Week) IS NOT NULL
        SELECT @sql=@sql + ' AND (CRMDR.Date_Created) BETWEEN ''' + convert(VARCHAR,@startdate) + ''' AND ''' +convert(VARCHAR,@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