Не в состоянии передать значение переменной в функции - PullRequest
0 голосов
/ 25 мая 2011

HI,

Я пытаюсь создать нижеуказанную функцию в SQL Server 2005. Как бы то ни было, это дает исключение, когда я пытаюсь RTrim передать значение @FULLNAME2 & @FULLNAME1.Исключение, требующее аргумента к Rtrim, однако, это было передано там.Обратите внимание, что я смог создать эту функцию, исключая раздел Rtrim.

Другая проблема заключается в том, что мне нужно вызывать эту функцию в представлении, вызываю ее с помощью select names ('val1','val2').Это говорит о том, что это не признанная функция.Однако я вижу эту функцию в таблице sysobjects, имеющей тип 'TF'.

Пожалуйста, предложите.

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

DECLARE @FinalResults TABLE  (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
SET @append = ''

SELECT @COUNT = COUNT(*)   FROM @FinalResults 

WHILE @i < @COUNT
BEGIN
IF  @FULLNAME1 = ''  
 BEGIN  
   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



ELSE 
  BEGIN
         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
         BEGIN
         SET    @FREEZENAME1 = 'TRUE';
                IF @FULLNAME2 = ''   
                   BEGIN
                     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


ELSE
       BEGIN
                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
       END
       END
       END

IF @append = '' 

           SET @append = (SELECT NAME254 FROM @FinalResults WHERE SRNO = @i );

         Else

           SET @append = @append + '/'+ (SELECT NAME254 FROM @FinalResults WHERE SRNO = @i );



SET @i = @i +1

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

     SET @FULLNAME2 = RTrim(@FULLNAME2, '/');
   End


INSERT INTO @FinalResults1 VALUES (@FULLNAME1, @FULLNAME2)


RETURN  

END 

Ответы [ 2 ]

1 голос
/ 25 мая 2011

функция RTRIM используется для удаления пробелов с правой стороны строки;

DECLARE @string VARCHAR(20)
SET @string = '  text and text     '
SELECT RTRIM(@string)

Это вернет значение: ' text and text'

Табличную функцию необходимо рассматривать как источник данных в операторе выбора:

SELECT * from dbo.values('val1', 'val2')
1 голос
/ 25 мая 2011

Если это табличная функция (возвращает таблицу), вы должны вызывать ее следующим образом

select <fields> from dbo.name(<parameters>)

Также функции rtrim работают не так, как вы хотите, они ожидают один аргумент и затемудаляет все пробелы справа от строки

Вам также не хватает пары BEGIN в условиях, вызывающих RTRIM, или вы также можете удалить Ends.

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

Я посмотрелв вашей функции и в цикле while есть несколько странных вещей, есть участки кода, которые никогда не будут выполнены, я пытался переписать эквивалентную функцию, надеюсь, это поможет вам

CREATE FUNCTION dbo.names(@CUSTID varchar(20),@effdt datetime)
RETURNS @results TABLE (Name1 nvarchar(254), Name2 nvarchar(254)) 
AS
BEGIN   
DECLARE rCursor CURSOR FOR
 SELECT (C.NAME1) AS name
 FROM PS_ARB_CU_CLST_STN AS A , PS_ARB_CU_STATIONS AS C 
 WHERE A.EFF_STATUS = 'A' AND 
  A.EFFDT = (
   SELECT MAX(B.EFFDT) 
   FROM PS_ARB_CU_CLST_STN AS 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),
        @fullname2 nvarchar(128),
        @append NVARCHAR (254); 
SET @fullname1 = '';
SET @fullname2 = '';
SET @append = ''

OPEN rCursor;
FETCH NEXT FROM rCursor INTO @name

WHILE @@FETCH_STATUS = 0 AND LEN(@fullname1 + @name) < 40
BEGIN
    SET @fullname1 = @fullname1 + '/' + @name
    FETCH NEXT FROM rCursor INTO @name
END

WHILE @@FETCH_STATUS = 0 AND LEN(@fullname2 + @name) < 40
BEGIN
    SET @fullname2 = @fullname2 + '/' + @name;
    FETCH NEXT FROM rCursor INTO @name;
END

--Append is not used 
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @append = @append + '/' + @name;
    FETCH NEXT FROM rCursor INTO @name;
END

CLOSE rCursor;
DEALLOCATE rCursor;

INSERT INTO @results VALUES (@fullname1, @fullname2)
RETURN
END
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...