Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql “在”处出错;return";陈述_Sql_Sql Server - Fatal编程技术网

Sql “在”处出错;return";陈述

Sql “在”处出错;return";陈述,sql,sql-server,Sql,Sql Server,我在sql server中编写了一个表值函数,但在“return语句”中遇到了一个错误 代码中的所有语句都是正确的,但我不知道为什么会出现这个错误 我的错误是 Incorrect syntax near the keyword 'RETURN'. 我的sql函数是 ALTER FUNCTION [dbo].[WEEKLY_REPORT](@START_DATE DATETIME, @END_DATE DATETIME,@PRACTISE NVARCHAR(MAX)) RETURNS @WEEK

我在sql server中编写了一个表值函数,但在“return语句”中遇到了一个错误 代码中的所有语句都是正确的,但我不知道为什么会出现这个错误

我的错误是

Incorrect syntax near the keyword 'RETURN'.
我的sql函数是

ALTER FUNCTION [dbo].[WEEKLY_REPORT](@START_DATE DATETIME, @END_DATE DATETIME,@PRACTISE NVARCHAR(MAX))
RETURNS @WEEKLY_REPORT_DETAILS_INFORMATION TABLE
(
RESOURCE_NAME NVARCHAR(MAX),
DAY1 DECIMAL(5,2),
DAY2 DECIMAL(5,2),
DAY3 DECIMAL(5,2),
DAY4 DECIMAL(5,2),
DAY5 DECIMAL(5,2),
DAY6 DECIMAL(5,2),
DAY7 DECIMAL(5,2),
UTILIZATION INT
)
AS 
BEGIN
DECLARE
    @RESOURCE_NAME NVARCHAR(MAX),
    @DAY1 DECIMAL(5,2),
    @DAY2 DECIMAL(5,2),
    @DAY3 DECIMAL(5,2),
    @DAY4 DECIMAL(5,2),
    @DAY5 DECIMAL(5,2),
    @DAY6 DECIMAL(5,2),
    @DAY7 DECIMAL(5,2),
    @UTILIZATION INT,
    @LAST_DAY1 INT,
@MONTH NVARCHAR(MAX),
@START_DAY INT,
@END_DAY INT,
@COUNT INT,
@COUNT_TEST INT,
@QUERY NVARCHAR(MAX);
BEGIN
    SET @MONTH = DATENAME(MONTH,@START_DATE)
    SET @START_DAY = DATENAME(DAY,@START_DATE)
    SET @END_DAY = DATENAME(DAY,@END_DATE)
    SET @COUNT = @END_DAY -@START_DAY + 1
--  SET @QUERY='SELECT A.NAME, '

--SET @QUERY = ' INSERT INTO @WEEKLY_REPORT_DETAILS_INFORMATION(RESOURCE_NAME,DAY1,DAY2,DAY3,
--              DAY4,DAY5,DAY6,DAY7,UTILIZATION) SELECT A.NAME,'
CREATE TABLE TEMP(RESOURCE_NAME NVARCHAR(MAX), DAY1 DECIMAL(5,2),
    DAY2 DECIMAL(5,2),
    DAY3 DECIMAL(5,2),
    DAY4 DECIMAL(5,2),
    DAY5 DECIMAL(5,2),
DAY6 DECIMAL(5,2),
DAY7 DECIMAL(5,2))

SET @QUERY = ' INSERT INTO #TEMP(RESOURCE_NAME,DAY1,DAY2,DAY3,DAY4,DAY5,DAY6,DAY7)' +
             ' SELECT A.NAME,'
    SET @COUNT_TEST = 1
WHILE @COUNT_TEST <= @COUNT
BEGIN
    IF(DATEPART(MONTH,@START_DATE)=DATEPART(MONTH,@END_DATE))
    BEGIN
        IF(@COUNT_TEST =@COUNT)
    BEGIN
        SET @QUERY=@QUERY + 'B.D' + CONVERT(NVARCHAR ,@START_DAY)
        SET @START_DAY = @START_DAY + 1
    END
    ELSE
    BEGIN
        SET @QUERY=@QUERY + 'B.D' + CONVERT(NVARCHAR ,@START_DAY) + ', ' 
        SET @START_DAY = @START_DAY + 1
    END
    SET @COUNT_TEST =@COUNT_TEST + 1    
END
ELSE 
BEGIN
    IF( DATEPART(MONTH,@START_DATE) = 1 OR DATEPART(MONTH,@START_DATE) = 3 OR
        DATEPART(MONTH,@START_DATE) = 5 OR DATEPART(MONTH,@START_DATE) = 7 OR
        DATEPART(MONTH,@START_DATE) = 8 OR DATEPART(MONTH,@START_DATE) = 10 OR
        DATEPART(MONTH,@START_DATE) = 12 )
    BEGIN   
        SET @LAST_DAY1 = DATENAME(DAY,@START_DATE)
        WHILE (@LAST_DAY1 <= 31 )
        BEGIN
            IF(@COUNT_TEST =@COUNT)
                SET @QUERY=@QUERY + 'B.D' + CONVERT(NVARCHAR ,@LAST_DAY1)
            ELSE
                SET @QUERY=@QUERY + 'B.D' + CONVERT(NVARCHAR ,@LAST_DAY1) + ', '
        SET @COUNT_TEST =@COUNT_TEST + 1 
        SET @LAST_DAY1 = @LAST_DAY1 +1  
        END
        SET @LAST_DAY1 = DATENAME(DAY,@END_DATE) - (DATENAME(DAY,@END_DATE)-1)
        WHILE (@LAST_DAY1 <=  DATENAME(DAY,@END_DATE))
        BEGIN
            IF(@COUNT_TEST =@COUNT)
                SET @QUERY=@QUERY + 'C.D' + CONVERT(NVARCHAR ,@LAST_DAY1)
            ELSE
                SET @QUERY=@QUERY + 'C.D' + CONVERT(NVARCHAR ,@LAST_DAY1) + ', '
        SET @COUNT_TEST =@COUNT_TEST + 1
        SET @LAST_DAY1 = @LAST_DAY1 +1      
        END
    END
    ELSE 
    IF( DATEPART(MONTH,@START_DATE) = 4 OR DATEPART(MONTH,@START_DATE) = 6 OR
             DATEPART(MONTH,@START_DATE) = 9 OR DATEPART(MONTH,@START_DATE) = 11 )
    BEGIN       
        SET @LAST_DAY1 = DATENAME(DAY,@START_DATE)
        WHILE (@LAST_DAY1 <= 30 )
        BEGIN
            IF(@COUNT_TEST =@COUNT)
                SET @QUERY=@QUERY + 'B.D' + CONVERT(NVARCHAR ,@LAST_DAY1)       
            ELSE
                SET @QUERY=@QUERY + 'C.D' + CONVERT(NVARCHAR ,@LAST_DAY1) + ', '
        SET @COUNT_TEST =@COUNT_TEST + 1
        SET @LAST_DAY1 = @LAST_DAY1 +1      
        END
        SET @LAST_DAY1 = DATENAME(DAY,@END_DATE) - (DATENAME(DAY,@END_DATE)-1)
        WHILE (@LAST_DAY1 <=  DATENAME(DAY,@END_DATE))
        BEGIN
            IF(@COUNT_TEST =@COUNT)
                SET @QUERY=@QUERY + 'B.D' + CONVERT(NVARCHAR ,@LAST_DAY1)
            ELSE
                SET @QUERY=@QUERY + 'C.D' + CONVERT(NVARCHAR ,@LAST_DAY1) + ', '
        SET @COUNT_TEST =@COUNT_TEST + 1
        SET @LAST_DAY1 = @LAST_DAY1 +1      
        END
    END
    ELSE
    BEGIN
        SET @LAST_DAY1 = DATENAME(DAY,@START_DATE)
        WHILE (@LAST_DAY1 <= 28 )
        BEGIN
            IF(@COUNT_TEST =@COUNT)
                SET @QUERY=@QUERY + 'B.D' + CONVERT(NVARCHAR ,@LAST_DAY1)
            ELSE
                SET @QUERY=@QUERY + 'C.D' + CONVERT(NVARCHAR ,@LAST_DAY1) + ', '
        SET @COUNT_TEST =@COUNT_TEST + 1
        SET @LAST_DAY1 = @LAST_DAY1 +1   
        END
        SET @LAST_DAY1 = DATENAME(DAY,@END_DATE) - (DATENAME(DAY,@END_DATE)-1)
        WHILE (@LAST_DAY1 <=  DATENAME(DAY,@END_DATE))
        BEGIN
            IF(@COUNT_TEST =@COUNT)
                SET @QUERY=@QUERY + 'B.D' + CONVERT(NVARCHAR ,@LAST_DAY1)
            ELSE
                SET @QUERY=@QUERY + 'C.D' + CONVERT(NVARCHAR ,@LAST_DAY1) + ', '
        SET @COUNT_TEST =@COUNT_TEST + 1
        SET @LAST_DAY1 = @LAST_DAY1 +1   
        END
    END
END 
END

IF(DATENAME(MONTH,@START_DATE)=DATENAME(MONTH,@END_DATE))
BEGIN
    SET @QUERY = @QUERY + ' FROM EMPLOYEE A JOIN CP_DETAILS B' +
                ' ON A.ID = B.EMPLOYEE_ID WHERE B.MONTH_USED = ' + '''' + @MONTH + '''' +
                ' AND B.YEAR_USED = ' + DATENAME(YEAR,@START_DATE) + 
                ' AND B.PRACTISE=' + '''' + @PRACTISE + ''''
END
ELSE
BEGIN
    SET @QUERY = @QUERY + ' FROM EMPLOYEE A JOIN CP_DETAILS B' +
                ' ON A.ID = B.EMPLOYEE_ID JOIN CP_DETAILS C ON A.ID=C.EMPLOYEE_ID' +
                ' WHERE B.MONTH_USED = ' + '''' + DATENAME        (MONTH,@START_DATE) + '''' +
                ' AND B.YEAR_USED = ' + DATENAME(YEAR,@START_DATE) + 
                ' AND B.PRACTISE=' + '''' + @PRACTISE + '''' + 
                ' AND C.MONTH_USED=' + '''' + DATENAME(MONTH,@END_DATE) + ''''
END

EXEC SP_EXECUTESQL @QUERY

DECLARE CP_DETAILS CURSOR FOR SELECT * FROM TEMP

OPEN CP_DETAILS
FETCH NEXT FROM CP_DETAILS INTO @RESOURCE_NAME,@DAY1,@DAY2,@DAY3,@DAY4,@DAY5,@DAY6,@DAY7

WHILE (@@FETCH_STATUS =0)
BEGIN
    SET @UTILIZATION = dbo.UTILIZATION(@START_DATE,@END_DATE,@DAY1,
                                    @DAY2,@DAY3,@DAY4,@DAY5,@DAY6,@DAY7)
    INSERT INTO @WEEKLY_REPORT_DETAILS_INFORMATION VALUES(@RESOURCE_NAME,
                @DAY1,@DAY2,@DAY3,@DAY4,@DAY5,@DAY6,@DAY7,@UTILIZATION)

    FETCH NEXT FROM CP_DETAILS INTO @RESOURCE_NAME,@DAY1,@DAY2,@DAY3,@DAY4,@DAY5,@DAY6,@DAY7
END
CLOSE CP_DETAILS
DEALLOCATE CP_DETAILS
DROP TEMP
RETURN ---error here
END
END
ALTER函数[dbo].[每周报告](@START\u DATE DATETIME、@END\u DATE DATETIME、@practice NVARCHAR(MAX))
返回@WEEKLY\u REPORT\u DETAILS\u信息表
(
资源名称NVARCHAR(最大值),
第1天十进制(5,2),
第2天十进制(5,2),
第3天十进制(5,2),
第4天十进制(5,2),
第5天十进制(5,2),
第6天十进制(5,2),
第7天十进制(5,2),
利用率整数
)
作为
开始
声明
@资源名称NVARCHAR(最大值),
@第1天十进制(5,2),
@第2天十进制(5,2),
@第3天十进制(5,2),
@第4天十进制(5,2),
@第5天十进制(5,2),
@第6天十进制(5,2),
@第7天十进制(5,2),
@利用率INT,
@最后一天1 INT,
@月份NVARCHAR(最大值),
@开始工作日,
@完整日,
@计数INT,
@计数测试INT,
@查询NVARCHAR(最大值);
开始
设置@MONTH=DATENAME(月、@START\u日期)
设置@START\u DAY=DATENAME(DAY,@START\u DATE)
设置@END\u DAY=DATENAME(DAY,@END\u DATE)
设置@COUNT=@END\u DAY-@START\u DAY+1
--SET@QUERY='SELECT A.NAME'
--设置@QUERY='插入@WEEKLY\u REPORT\u DETAILS\u信息(资源名称、第1天、第2天、第3天、,
--第4天、第5天、第6天、第7天、利用率)选择一个名称,'
创建表格温度(资源名称NVARCHAR(最大值),第1天十进制(5,2),
第2天十进制(5,2),
第3天十进制(5,2),
第4天十进制(5,2),
第5天十进制(5,2),
第6天十进制(5,2),
第7天十进制(5,2))
SET@QUERY='插入#TEMP(资源名称,第1天,第2天,第3天,第4天,第5天,第6天,第7天)'+
'选择一个名称,'
设置@COUNT\u TEST=1

虽然@COUNT_TESTLamak是正确的,但不能在函数中使用
EXEC
SP_EXECUTESQL
或类似的任何东西

也许可以将函数重新写入存储过程


关于语法错误,您是否应该编写
DROP TABLE TEMP
而不是
DROP TEMP

不知道为什么它会告诉您错误在
RETURN
上,但这在函数上无效:
EXEC SP_EXECUTESQL@QUERY
将“RETURN”前面的“DROP TEMP”更改为“DROP TABLE TEMP”同意这应该是一个存储过程,而不是一个函数。另外,
RETURN
应该指定一个值,例如,
return0