sqlserver存储过程转mysql程序过程

z415353144 2010-05-31 03:03:41
ALTER PROCEDURE [dbo].[Proc_Common_UpDown] 
@Sign int = 0, -- 0: 上移 1:下移
@TableName nvarchar(50), -- 表名
@ItemName nvarchar(50), -- 主键字段名
@ItemID int, -- 主键ID
@SortName nvarchar(50), -- 排序ID
@TypeName nvarchar(50)='', -- 分类字段名
@TypeValue nvarchar(50)= '' -- 分类值
AS
BEGIN
SET NOCOUNT ON
DECLARE
@SQL nvarchar(4000),
@ThisSort int, -- 当前ID
@PREVID int, -- 前一个ID
@NextID int, -- 后一个ID
@Count int

--临时索引表--
CREATE TABLE #Tab
(
ItemID int,
Sort int
)
SET @SQL = 'INSERT INTO #Tab (ItemID,Sort) SELECT '
+@ItemName+','+@SortName+' FROM '+@TableName

IF (@TypeName<>'' AND @TypeValue<>'') SET @SQL = @SQL+' WHERE '+@TypeName+'='+@TypeValue
SET @SQL = @SQL+' ORDER BY Sort ASC '
EXEC(@SQL)
SET @SQL = ''

SELECT @Count = COUNT(*) FROM #Tab
SELECT @ThisSort = Sort FROM #Tab WHERE ItemID = @ItemID
IF(@ThisSort>1) SELECT @PREVID = ItemID FROM #Tab WHERE Sort=(@ThisSort-1)
IF(@ThisSort<@Count) SELECT @NextID = ItemID FROM #Tab WHERE Sort=(@ThisSort+1)

IF(@Sign=0)
BEGIN
IF(@ThisSort>1)
BEGIN
SET @SQL = 'UPDATE '+@TableName+' SET '+@SortName+'='+CONVERT(varchar(100),(@ThisSort-1))+' WHERE '+@ItemName+' = '+CONVERT(varchar(100),@ItemID) + ';'
+ 'UPDATE '+@TableName+' SET '+@SortName+'='+CONVERT(varchar(100),@ThisSort)+' WHERE '+@ItemName+' = '+CONVERT(varchar(100),@PREVID)

END
END
ELSE
BEGIN
IF(@ThisSort<@Count)
BEGIN
SET @SQL = 'UPDATE '+@TableName+' SET '+@SortName+'='+CONVERT(varchar(100),(@ThisSort+1))+' WHERE '+@ItemName+' = '+CONVERT(varchar(100),@ItemID) + ';'
+ 'UPDATE '+@TableName+' SET '+@SortName+'='+CONVERT(varchar(100),@ThisSort)+' WHERE '+@ItemName+' = '+CONVERT(varchar(100),@NextID)
END
END

EXEC(@SQL)

END

exec Proc_Common_UpDown 1,'pktable','id','4','sort','',''

转成mysql,100分酬谢!
我改写的没有成功的代码:
delimiter $$
drop procedure if exists ChangeSequence$$
create procedure ChangeSequence
(
_sign int ,-- 0: 上移 1:下移
TableName varchar(50) ,-- 表名
ItemName varchar(50) ,-- 主键字段名
ItemID int , -- 主键ID
SortName varchar(50) , -- 排序ID
TypeName varchar(50) , -- 分类字段名
TypeValue varchar(50) -- 分类值
)
begin
declare _SQL varchar(4000);
declare ThisSort int;
declare PREVID int;
declare NextID int;
declare _Count int;

create temporary table _Tab
(
_ItemID int,
_Sort int
);
set _SQL=concat('INSERT INTO _Tab (_ItemID,_Sort) SELECT ' ,ItemName,SortName,' FROM ',TableName) ;

if (TypeName<>'' and TypeValue<>'') then
set _SQL=concat(_SQL,' where ',TypeName,'=',TypeValue);
end if;
SET _SQL = concat(_SQL,' ORDER BY _Sort ASC ') ;
set @v_sql=_SQL;
prepare stmt from @v_sql;
execute stmt;
deallocate prepare stmt;
SET _SQL = '';

SELECT _Count = COUNT(*) FROM _Tab ;
SELECT ThisSort = _Sort FROM _Tab WHERE _ItemID = ItemID;
IF(ThisSort>1) then
SELECT PREVID = _ItemID FROM _Tab WHERE _Sort=(ThisSort-1);
end if;
IF(ThisSort<_Count) then SELECT NextID = _ItemID FROM _Tab WHERE _Sort=(ThisSort+1);end if;


if(_Sign=0) then
if(ThisSort>1) then
set _SQL = concat('UPDATE ',TableName,' SET ',SortName,'=','CONVERT((',ThisSort,'-1),varchar(100))',' WHERE ',ItemName,' = ','CONVERT(',ItemID,',varchar(100))' , ';' ,
'UPDATE ',TableName,' SET ',SortName,'=','CONVERT(',ThisSort,',varchar(100))',' WHERE ',ItemName,' = ','CONVERT(',PREVID,',varchar(100))');
end if;
else
IF(ThisSort<_Count) then
SET _SQL =concat( 'UPDATE ',TableName,' SET ',SortName,'=','CONVERT((',ThisSort,'+1),varchar(100))',' WHERE ',ItemName,' = ','CONVERT(',ItemID,',varchar(100))',';',
'UPDATE ',TableName,' SET ',SortName,'=','CONVERT(',ThisSort,',varchar(100))',' WHERE ',ItemName,' = ','CONVERT(',NextID,',varchar(100))');
end if;
end if;
set @v_sql1=_SQL;
prepare stmt1 from @v_sql1;
execute stmt1;
deallocate prepare stmt1;
end$$


...全文
332 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2010-06-04
  • 打赏
  • 举报
回复
[Quote]其实我是一点mysql语法都不会的,写了一天写了个错误的。[/Quote]

语法并不复杂,如果你熟悉SQL SERVER的T-SQL语法,则对照着看一下MYSQL的语法文档就可以,最多只需要20 min,哪怕你从来没用过MYSQL。

把你写得错的那个贴出来,同时把错误信息一起贴出来。
WWWWA 2010-06-04
  • 打赏
  • 举报
回复
1楼的代码是根据你的代码修改的,你自行测试一下结果,语法没有问题了。
z415353144 2010-06-04
  • 打赏
  • 举报
回复
其实我是一点mysql语法都不会的,写了一天写了个错误的。
iihero 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 z415353144 的回复:]

要钱,不给;
要分,就给;
要命,不给。
[/Quote]
嗯,有骨气。这么多人回了贴,你可以参照前边的思路,自己改改就行了。
懒得去死 2010-06-02
  • 打赏
  • 举报
回复
这么长的代码要付钱的。哈哈。
z415353144 2010-06-02
  • 打赏
  • 举报
回复
要钱,不给;
要分,就给;
要命,不给。
WWWWA 2010-06-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 z415353144 的回复:]
怎么没人解决啊
[/Quote]
1娄的代码测试没有?
z415353144 2010-06-01
  • 打赏
  • 举报
回复
怎么没人解决啊
WWWWA 2010-05-31
  • 打赏
  • 举报
回复
1楼的代码语法没有问题了,自行测试一下,看看结果如何
z415353144 2010-05-31
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100528/14/6b0b08cf-e994-4706-b646-784b36514137.html
就是这个帖子的续。
ACMAIN_CHM 2010-05-31
  • 打赏
  • 举报
回复
太长了。

建议描述一下你的这个存储过程的功能。或者自己参考一下MYSQL的手册中的语法自己修改一下。

MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
wwwwb 2010-05-31
  • 打赏
  • 举报
回复
DELIMITER $$
DROP PROCEDURE IF EXISTS ChangeSequence$$
CREATE PROCEDURE ChangeSequence
(
_sign INT ,-- 0: 上移 1:下移
TableName VARCHAR(50) ,-- 表名
ItemName VARCHAR(50) ,-- 主键字段名
ItemID INT , -- 主键ID
SortName VARCHAR(50) , -- 排序ID
TypeName VARCHAR(50) , -- 分类字段名
TypeValue VARCHAR(50) -- 分类值
)
BEGIN
DECLARE _SQL VARCHAR(4000);
DECLARE ThisSort INT;
DECLARE PREVID INT;
DECLARE NextID INT;
DECLARE _Count INT;

CREATE TEMPORARY TABLE _Tab
(
_ItemID INT,
_Sort INT
);
SET _SQL=CONCAT('INSERT INTO _Tab (_ItemID,_Sort) SELECT ' ,ItemName,SortName,' FROM ',TableName) ;

IF (TypeName<>'' AND TypeValue<>'') THEN
SET _SQL=CONCAT(_SQL,' where ',TypeName,'=',TypeValue);
END IF;
SET _SQL = CONCAT(_SQL,' ORDER BY _Sort ASC ') ;
SET @v_sql=_SQL;
PREPARE stmt FROM @v_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET _SQL = '';

SELECT COUNT(*) INTO _Count FROM _Tab ;
SELECT Sort INTO ThisSort FROM _Tab WHERE _ItemID = ItemID;
IF(ThisSort>1) THEN
SELECT _ItemID INTO PREVID FROM _Tab WHERE _Sort=(ThisSort-1);
END IF;
IF(ThisSort<_Count) THEN SELECT _ItemID INTO NextID FROM _Tab WHERE _Sort=(ThisSort+1);END IF;


IF(_Sign=0) THEN
IF(ThisSort>1) THEN
SET _SQL = CONCAT('UPDATE ',TableName,' SET ',SortName,'=','CONVERT((',ThisSort,'-1),varchar(100))',' WHERE ',ItemName,' = ','CONVERT(',ItemID,',varchar(100))' , ';' ,
'UPDATE ',TableName,' SET ',SortName,'=','CONVERT(',ThisSort,',varchar(100))',' WHERE ',ItemName,' = ','CONVERT(',PREVID,',varchar(100))');
END IF;
ELSE
IF(ThisSort<_Count) THEN
SET _SQL =CONCAT( 'UPDATE ',TableName,' SET ',SortName,'=','CONVERT((',ThisSort,'+1),varchar(100))',' WHERE ',ItemName,' = ','CONVERT(',ItemID,',varchar(100))',';',
'UPDATE ',TableName,' SET ',SortName,'=','CONVERT(',ThisSort,',varchar(100))',' WHERE ',ItemName,' = ','CONVERT(',NextID,',varchar(100))');
END IF;
END IF;
SET @v_sql1=_SQL;
PREPARE stmt1 FROM @v_sql1;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END$$

语法没有问题,不知道结果如何

56,937

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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