2011-05-25 77 views
0

HI内通过变量值,无法功能

我试图在SQL Server 2005创建以下功能Howver它给人异常,当我试图在RTRIM进行@FULLNAME2 & @FULLNAME1值。异常请求Rtrim的参数,但它已经通过了。 请注意我已经能够创建这个功能,不包括Rtrim部分。

另一个问题是我需要在视图中调用此函数,我打电话给它使用select names ('val1','val2')。它指出这不是一个公认的功能。不过,我可以在类型为'TF'的sysobjects表中看到这个函数。

请建议。

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 

回答

1

如果它是一个表值函数(返回表),你应该可以调用它像这样

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

而且RTRIM功能不工作,你希望的方式,它期望一个参数然后删除字符串右侧的所有空格

在调用RTRIM的条件下,您还缺少一些BEGIN,或者也可以删除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 
+0

您好,感谢您的答复。我做了necesarry更改,并可以创建该功能。但是当我调用函数时,它给了我空白值。我认为这是因为我正在通过。我已经将effdt定义为日期时间,并且我的查询获取的数据为'2011-04-21 00:00:00.000'。如何解决这个问题? – Dhiraj 2011-05-25 13:27:22

+0

是否将@effdt varchar(20)更改为@effdt datetime? – 2011-05-25 13:43:46

+0

是的,我改变它datetime,而且我注意到,长度= LEN((SELECT NAME254 FROM @FinalResults WHERE SRNO = @i)返回正确的值说7,但是当我检查lenght = LEN((SELECT NAME254 FROM @FinalResults WHERE SRNO = @)+'/')它的给予41 ..didnt得到为什么这是如此?? – Dhiraj 2011-05-25 15:43:00

1

函数RTRIM用于删除字符串右侧的空白;

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

这将返回值:' text and text'

的表需要考虑在SELECT语句中的数据源值函数:

SELECT * from dbo.values('val1', 'val2') 
+0

感谢您的回复。我需要删除'/'在右边。我怎么能在我的代码中。我不能使用RTRIM我使用的方式,或者我需要使用其他功能,而不是RTRIM – Dhiraj 2011-05-25 11:36:08

+0

@Dhiraj:所以,你的实际问题基本上是*'我的RTRIM表达式有什么问题?'*。我认为菲利普已经很好地回答了。我希望你认识到你的下一个问题,*'如何删除线索'/''''*(顺便说一句,非常好)完全不同。因此它应该作为一个新问题发布。 – 2011-05-25 15:00:36