我在SQL Server 14上运行的PowerBuilder 9中遇到此错误“必须声明标量变量@return”。当我使用SQL管理工作室执行存储过程时,它会按预期返回10000。但是在从PowerBuilder调用此SP时,我遇到了错误。任何建议表示赞赏。感谢
Function in PowerBuilder code:
Declare sp_v procedure for
@return = proc_v_sp
@eid = :p_eid,
@year = :p_year,
@bid = :p_bid,
@hid = :p_hid
using sqlca;
Execute sp_v;
IF SQLCA.SQLCode <> 0 THEN
lReturn = SQLCA.SQLCode
ELSE
FETCH sp_v INTO :lReturn;
END IF
CLOSE sp_v;
In SQL SERVER SP:
Alter procedure proc_v_sp
@eid int,
@year int,
@bid varchar(8),
@hid char(3)
As
Begin
Declare @count int,
Declare..............
..........ignoring as it is long SP...........
Select @count = count(*)
from sy_e
where sy_e_eid = @eid and sy_e_year= @year
IF @count >0
RETURN 20000
ELSE
RETURN 10000
END
答案 0 :(得分:0)
查看文档,我没有看到有关如何从执行的存储过程中获取RETURN值的任何信息。该文档列出了PB中SP声明的语法为...
DECLARE logical_procedure_name PROCEDURE FOR
SQL_Server_procedure_name
@Param1 = value1, @Param2 = value2,
@Param3 = value3 OUTPUT,
{USING transaction_object} ;
这就是为什么你得到语法错误。它只是不期待@return。如果您可以更改存储过程,那么您应该能够使用OUTPUT参数。经过一段谷歌搜索后,看起来你仍然需要在EXECUTE之后使用FETCH来获取为填充的输出参数指定的变量。
我回到这里,一旦我在我面前有PB,因为我很好奇是否有可能。经过一些实验并查看了RETURN的MSDN文档后,我能够使用下面的代码获取returnValue变量中填充的返回值。
long returnValue
DECLARE sp_test PROCEDURE FOR
@return_status = sp_test_return
USING SQLCA;
EXECUTE sp_test;
FETCH sp_test INTO :returnValue;
这是存储过程。
CREATE PROCEDURE [dbo].[sp_test_return]
AS
RETURN 159
GO
答案 1 :(得分:0)
你太过刻苦了......
将RETURN更改为SELECT,并使用存储过程数据窗口。然后,您可以删除所有代码,并将其替换为一行。
dw.retrieve(args)
你的返回值是dw.getItemNumber(1,&#34; return_status&#34;)
-Paul -
答案 2 :(得分:0)
我没有示例代码 但它非常简单......您的SP需要返回结果集而不是返回值 - 即使该结果集是单行上的单个值。
将RETURN更改为SELECT。返回结果集。
现在,创建一个数据窗口并选择存储过程作为数据源。然后选择你的sp作为源。通过提供参数值并查看它是否返回您正在查找的结果来测试它。
从这里开始,它只是PB代码。
datastore myDW
myDW = create datastore
myDW.setTransObject( SQLCA )
myDW.retrieve( args... )
theResult = myDW.getItemNumber( 1, "return_status" )