2011-05-24 30 views
3

我需要創建一個函數來對待返回到SQL視圖的數據進行特定處理。如何在SQL Server 2005中聲明表函數

我設計的功能如下,但是我得到錯誤說

必須聲明表變量 「@FINALRESULTS」

雖然我已經將它定義爲表。

你能幫我製作這個功能可執行文件嗎?

感謝您的幫助!

CREATE FUNCTION dbo.names(@CUSTID varchar(20), @effdt varchar(20)) 
RETURNS @FinalResults1 (Name1 nvarchar(254), Name2 nvarchar(254)) 
AS 
BEGIN 
    DECLARE TABLE @FinalResults (Name254 nvarchar(254), SRNO nvarchar(3)) 

    CREATE TABLE @FinalResults (Name254 nvarchar(254), SRNO nvarchar(3)) 

    INSERT INTO @FinalResults 
    SELECT(C.NAME1),ROW_NUMBER() OVER(ORDER BY A.SEQ_NBR) 
    FROM PS_ARB_CU_CLST_STN A , PS_ARB_CU_STATIONS C 
    WHERE A.EFF_STATUS = 'A' 
     AND A.EFFDT = (SELECT MAX(B.EFFDT) 
         FROM PS_ARB_CU_CLST_STN B 
         WHERE A.SETID = B.SETID 
         AND A.CUST_ID = B.CUST_ID 
         AND B.EFFDT <= @effdt) 
     AND A.SETID = C.SETID 
     AND A.ARB_STATION_ID =C.CUST_ID 
     AND A.CUST_ID = @CUSTID 
     AND C.EFFDT = (SELECT MAX(D.EFFDT) 
         FROM PS_ARB_CU_STATIONS D 
         WHERE C.CUST_ID = D.CUST_ID 
         AND D.SETID = C.SETID 
         AND D.EFFDT <= @effdt) 
ORDER BY 
    A.SEQ_NBR 

DECLARE @Name nvarchar(254), @FULLNAME1 nvarchar(128), @FREEZENAME1 nvarchar(10), @append NVARCHAR (254) 
DECLARE @FULLNAME254 nvarchar(254), @FULLNAME2 nvarchar(128), @FREEZENAME2 nvarchar(10), @COUNT INT, @i INT 

SET @Name = '' 
SET @FREEZENAME1 = 'FALSE' 
SET @FREEZENAME2 = 'FALSE' 
SET @FULLNAME1 = '' 
SET @FULLNAME2 = '' 
SET @FULLNAME254 = '' 
SET @COUNT = 0 
SET @i = 0 

SELECT @COUNT = COUNT(*) FROM @FinalResults 

WHILE @i < @COUNT 
BEGIN 
    IF @FULLNAME1 = '' 
    IF(LEN((SELECT NAME254 FROM @FinalResults WHERE SRNO = @i)+ '/')<= 40 AND @FREEZENAME1 = 'FALSE') 
     SET @FULLNAME1 = (SELECT NAME254 FROM @FinalResults WHERE SRNO = @i + '/'); 
    ELSE 
     SET @FREEZENAME1 = 'TRUE'; 
    END IF 
    ELSE 
    IF (LEN(@FULLNAME1 +(SELECT NAME254 FROM @FinalResults WHERE SRNO = @i)+ '/') <=40 AND @FREEZENAME1 = 'FALSE') 
     SET @FULLNAME1 = (@FULLNAME1 +(SELECT NAME254 FROM @FinalResults WHERE SRNO = @i)+ '/') ; 
    ELSE 
     SET @FREEZENAME1 = 'TRUE'; 

    IF @FULLNAME2 = '' 
     IF (LEN((SELECT NAME254 FROM @FinalResults WHERE SRNO = @i)+ '/')<= 40 AND @FREEZENAME2 = 'FALSE') 
      SET @FULLNAME2 = ((SELECT NAME254 FROM @FinalResults WHERE SRNO = @i)+ '/') ; 
     ELSE 
      SET @FREEZENAME2 = 'TRUE'; 
     END IF 
    ELSE 
     IF (LEN(@FULLNAME2 +(SELECT NAME254 FROM @FinalResults WHERE SRNO = @i)+ '/') <=40 AND @FREEZENAME2 = 'FALSE') 
    SET @FULLNAME2 = (@FULLNAME2 +(SELECT NAME254 FROM @FinalResults WHERE SRNO = @i)+ '/') ; 
     ELSE 
    SET @FREEZENAME2 = 'TRUE'; 

     END-IF 
     END-IF 
     END-IF 
     END-IF 

IF @append = '' 
      @append = (SELECT NAME254 FROM @FinalResults WHERE SRNO = @i); 
     Else 
      @append = @append + '/'+ (SELECT NAME254 FROM @FinalResults WHERE SRNO = @i); 
      END-IF 

    END-IF 
SET @i = @i +1 
END 
END-WHILE 

    If (Len(@append) < 40) 
     @FULLNAME1 = RTrim(@FULLNAME2, '/'); 
    End-If; 
    If ((Len(@append) > 40) And 
     (Len(@append) < 80)) 

     @FULLNAME2 = RTrim(@FULLNAME2, '/'); 
    End-If; 

BEGIN 
INSERT INTO #FinalResults1 VALUES (@FULLNAME1, @FULLNAME2) 
END 
RETURN 

END 

GO 
SELECT Name1 
, Name2 
    FROM @FinalResults1 

回答

7
DECLARE TABLE @FinalResults (Name254 nvarchar(254), SRNO nvarchar(3)) 


CREATE TABLE @FinalResults (Name254 nvarchar(254), SRNO nvarchar(3)) 

應該只是

DECLARE @FinalResults TABLE (Name254 nvarchar(254), SRNO nvarchar(3)) 

此外,該函數的返回類型應該是

RETURNS @FinalResults1 TABLE (Name1 nvarchar(254), Name2 nvarchar(254)) 

似乎有更語法錯誤(你爲什麼要使用END-IF ?)但是,這應該回答所問的問題,我無意修復所有問題。

+0

謝謝馬丁!我是新來的SQL不知道的語法.. :(..搜索和嘗試逐個排列每個語法。不要理解你的幫助。 – Dhiraj 2011-05-24 12:19:04

+0

@Dhiraj這是從另一個RDBMS移植?END-IF'無效'TSQL'。您需要使用'IF()BEGIN <多語句塊> END' – 2011-05-24 12:21:21

+0

@Martin否它正在摺疊相同的數據庫。我可以在這裏使用'ELSE'作爲它提供的例外說ELSE附近的語法不正確嗎? – Dhiraj 2011-05-24 12:29:11