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