2013-03-14 56 views
0

我已經在sql server中寫了一個表值函數,並且在「return語句」中面臨錯誤 代碼中的所有語句都是正確的,但我不知道爲什麼會出現此錯誤錯誤在「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 [email protected]_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 [email protected]) 
    BEGIN 
     SET @[email protected] + 'B.D' + CONVERT(NVARCHAR ,@START_DAY) 
     SET @START_DAY = @START_DAY + 1 
    END 
    ELSE 
    BEGIN 
     SET @[email protected] + 'B.D' + CONVERT(NVARCHAR ,@START_DAY) + ', ' 
     SET @START_DAY = @START_DAY + 1 
    END 
    SET @COUNT_TEST [email protected]_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 [email protected]) 
       SET @[email protected] + 'B.D' + CONVERT(NVARCHAR ,@LAST_DAY1) 
      ELSE 
       SET @[email protected] + 'B.D' + CONVERT(NVARCHAR ,@LAST_DAY1) + ', ' 
     SET @COUNT_TEST [email protected]_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 [email protected]) 
       SET @[email protected] + 'C.D' + CONVERT(NVARCHAR ,@LAST_DAY1) 
      ELSE 
       SET @[email protected] + 'C.D' + CONVERT(NVARCHAR ,@LAST_DAY1) + ', ' 
     SET @COUNT_TEST [email protected]_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 [email protected]) 
       SET @[email protected] + 'B.D' + CONVERT(NVARCHAR ,@LAST_DAY1)  
      ELSE 
       SET @[email protected] + 'C.D' + CONVERT(NVARCHAR ,@LAST_DAY1) + ', ' 
     SET @COUNT_TEST [email protected]_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 [email protected]) 
       SET @[email protected] + 'B.D' + CONVERT(NVARCHAR ,@LAST_DAY1) 
      ELSE 
       SET @[email protected] + 'C.D' + CONVERT(NVARCHAR ,@LAST_DAY1) + ', ' 
     SET @COUNT_TEST [email protected]_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 [email protected]) 
       SET @[email protected] + 'B.D' + CONVERT(NVARCHAR ,@LAST_DAY1) 
      ELSE 
       SET @[email protected] + 'C.D' + CONVERT(NVARCHAR ,@LAST_DAY1) + ', ' 
     SET @COUNT_TEST [email protected]_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 [email protected]) 
       SET @[email protected] + 'B.D' + CONVERT(NVARCHAR ,@LAST_DAY1) 
      ELSE 
       SET @[email protected] + 'C.D' + CONVERT(NVARCHAR ,@LAST_DAY1) + ', ' 
     SET @COUNT_TEST [email protected]_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 
+0

不知道爲什麼它會告訴你錯誤在'RETURN'上,但是這對一個函數是無效的:'EXEC SP_EXECUTESQL @ QUERY' – Lamak 2013-03-14 13:51:50

+0

在「RETURN」之前立即改變「DROP TEMP」到DROP TABLE TEMP「 – 2013-03-14 14:16:19

回答

0

Lamak是正確的,你不能使用EXECSP_EXECUTESQL或類似的功能。

也許你可以重寫你的函數到存儲過程?

關於語法錯誤,你不應該寫DROP TABLE TEMP而不是DROP TEMP

+0

同意這應該是一個存儲過程,而不是一個函數。另外,'RETURN'應該指定一個值,例如'RETURN 0'。 – 2013-03-14 16:16:21