2011-05-25 76 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