关于存储过程嵌套以及递归的问题?(PHP调用,高手请进,在线等)
存储过程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
帮忙找写法的错误,或者提供另外的思路。多谢了。急。