簡體   English   中英

如何在 SQL Server 2005 中的 function 中聲明表

[英]How to declare table in function in SQL Server 2005

我需要創建一個 function 對要返回到 SQL 視圖的數據進行某些處理。

我設計了 function 如下,但我收到錯誤消息

必須聲明表變量“@FINALRESULTS”

盡管我已將其定義為表格。

你能幫我制作這個 function 可執行文件嗎?

感謝你的幫助!!

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
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))

另外 function 的返回類型應該是

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

似乎還有更多的語法錯誤(你為什么使用END-IF ?)但這應該回答所提出的問題,我無意修復所有這些錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM