[英]Not able to pass variable value within function
你好,
我正在尝试在 SQL Server 2005 中的 function 下方创建。但是,当我尝试 RTrim @FULLNAME2 & @FULLNAME1
中携带的值时,它会给出异常。 向 Rtrim 请求参数的异常,但是它已被传递到那里。 请注意我已经能够创建这个 function 不包括 Rtrim 部分。
另一个问题是我需要在视图中调用这个 function,我使用select names ('val1','val2')
来调用它。 它声明这不是公认的 function。 但是我可以在类型为“TF”的 sysobjects 表中看到这个 function。
请建议。
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
如果它是一个表值 function (返回一个表),你应该这样称呼它
select <fields> from dbo.name(<parameters>)
rtrim 函数也不能按照您想要的方式工作,它需要一个 arguments 然后删除字符串右侧的所有空格
在调用 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
我查看了您的 function 和 while 循环有几个奇怪的东西,有些代码永远不会被执行,我试图重写一个等效的 function,我希望这对你有帮助
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
function RTRIM
用于删除字符串右侧的空格;
DECLARE @string VARCHAR(20)
SET @string = ' text and text '
SELECT RTRIM(@string)
这将返回值: ' text and text'
值 function 的表需要被视为 select 语句中的数据源:
SELECT * from dbo.values('val1', 'val2')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.