关于存储过程嵌套以及递归的问题?(PHP调用,高手请进,在线等)

wangxiaomax 2003-04-02 01:56:28
存储过程ManualIndexReorderAll在查询分析器运行是正确的,可以正确的排列顺序。而在PHP中调用以后,只会部分排序,很多纪录的行被赋了初值0,而没有正确的排序。我怀疑是PHP调用存储过程,可能某些变量没有被调用。以下为PHP调用,应该没有问题的。
<?php
require("serverinfo.php");
$connect=mssql_connect($SERVERNAME,$LOGINUSER,$LOGINPSWORD);
mssql_select_db($DATABASE,$connect);
//排序
$sqlSort="EXEC ManualIndexReorderAll";
$rstSort = mssql_query($sqlSort) or die("无法执行SQL:$sqlSort");
?>
以下为存储过程ManualIndexReorderAll,嵌套ManualIndexReorder,有些乱。

CREATE PROCEDURE ManualIndexReorderAll AS
DECLARE @ID INT,@ret INT,@Row INT,@Col INT,@ParentID INT
UPDATE ManualIndex SET ManualIndexRow=0
SET @Row = 0
SET @Col = 0
WHILE EXISTS (SELECT * FROM ManualIndex WHERE ManualIndexParentID=ManualIndexID AND ManualIndexRow=0)
BEGIN
SELECT TOP 1 @ID=ManualIndexID FROM ManualIndex
WHERE ManualIndexParentID=ManualIndexID AND ManualIndexRow=0
ORDER BY ManualIndexID
SELECT @Row = @Row+1
UPDATE ManualIndex SET ManualIndexRow = @Row, ManualIndexCol = @Col WHERE ManualIndexID = @ID
IF EXISTS (SELECT* FROM ManualIndex WHERE ManualIndexParentID=@ID AND ManualIndexRow=0)
BEGIN
SET @Col = @Col+1
EXEC @ret = ManualIndexReorder @ID,@Row,@Col
SET @Col = @Col-1
SELECT @Row = @ret
END
END
RETURN @Row
GO

以下为ManualIndexReorder,其中自己调用自己。
CREATE PROCEDURE ManualIndexReorder @ParentID int, @Row int, @Col int AS
DECLARE @ID AS INT,@ret AS INT
IF @ParentID = -1
UPDATE ManualIndex SET ManualIndexRow=0
WHILE EXISTS (SELECT * FROM ManualIndex WHERE ManualIndexParentID = @ParentID AND ManualIndexRow=0)
BEGIN
SELECT TOP 1 @ID=ManualIndexID FROM ManualIndex
WHERE ManualIndexParentID=@ParentID AND ManualIndexRow=0
ORDER BY ManualIndexParentID,ManualIndexID
SELECT @ID AS 'ID',@ParentID AS 'ParentID',@Row AS 'Row',@Col AS 'Col'
SELECT @Row = @Row+1
UPDATE ManualIndex SET ManualIndexRow = @Row, ManualIndexCol = @Col WHERE ManualIndexID = @ID
IF @ID=@ParentID
SELECT @Col = 0
SELECT @ret = @Col+1
IF EXISTS (SELECT* FROM ManualIndex WHERE ManualIndexParentID=@ID AND ManualIndexRow=0)
BEGIN
SET @Col = @Col+1
EXEC @ret = ManualIndexReorder @ID,@Row,@Col
SET @Col = @Col-1
SELECT @Row = @ret
END
END
RETURN @Row
GO

以下是正确显示结果。分不够可以再加。多谢大侠们!!
ManualIndexID ManualIndexParentID ManualIndexRow ManualIndexCol
1 1 1 0
2 1 2 1
3 1 3 1
4 3 4 2
5 5 5 0

帮忙找写法的错误,或者提供另外的思路。多谢了。急。
...全文
58 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangxiaomax 2003-04-02
  • 打赏
  • 举报
回复
晚上结帖。不管结果如何。
swordz 2003-04-02
  • 打赏
  • 举报
回复
PHP里应该这样调存储过程吧

Example:

<?php
$hostname = "tszzp";
$dbuser = "sa";
$dbpasswd = "";
$id = mssql_connect($hostname,$dbuser,$dbpasswd) or die("无法连接数据库服务器!");
$db = mssql_select_db("stock",$id) or die("无法连接stock数据库!");
$stockcode="600600";
$id = 0;
$msg = 0;
$query = "declare @result int, @id int, @msg varchar(20)\n";
$query.="exec @result=sp_test\n";
$query.="\"$stockcode\",\n";
$query.="@id output,\n";
$query.="@msg output;\n";
$query.="select @result result, @id id, @msg msg";
$query.="exec @result=sp_test\n";
$query.="\"$stockcode\",\n";
$query.="@id output,\n";
$query.="@msg output;\n";
$query.="select @result result, @id id, @msg msg";
$rresult = mssql_query($query) or die("无法执行SQL:$query");
$arr = mssql_fetch_array($rresult);
print $result;
print "<br>\n";
printf("%d, %d, %s<br>\n", $arr[result], $arr[id], $arr[msg]);
printf("%d, %s<br>\n", $id, $msg);
?>

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧