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

私は私の問題の解決策を得ました。この問題を解決するには、datetime 値を文字型に明示的にキャストして、クエリ文字列を期待どおりに連結できるようにする必要があります。

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 に答える