sql server存储过程转为mysql的

gzx嘻嘻嘻 2013-10-20 10:02:50
有一个sql server写的存储过程,现在想改成mysql 的,哪位大神帮帮忙啊!(这个存储过程的作用是输入表名,然后实现表的模糊查找)

if exists(select 1 from sysobjects where name='GetList')
drop proc GetList;

create proc GetList(@TableName VarChar(50), --表名
@Value VarChar(1000)) --要查找的值
as
declare
@columns varchar(50),
@Temp varchar(8000),
@i int,
@strCount int,
@values varchar(8000),
@SQLString nvarchar(500),
@ParmDefinition nvarchar(500),
@strlen int, --字符串的长度
@postion int,
@markStr varchar(100),
@sublen int, --子串的长度
@TEMPid int;
--使用游标保存表中符合条件的列
Declare getColumns CURSOR FOR
SELECT Sys.Columns.name
FROM Sys.tables,Sys.Types,Sys.Columns
WHERE sys.tables.object_Id = Sys.columns.object_Id
AND Sys.Types.system_type_id =

Sys.columns.system_type_id
AND Sys.Types.Name like '%char'
AND Sys.tables.Name = substring

(@TableName,charIndex('.',@TableName)+1,(LEN(@TableName)-charIndex

('.',@TableName)))
BEGIN
SELECT @Temp = '',@strCount = 0,@strlen=LEN(@Value),@markStr=' ';
if(RIGHT(@Value,1)<>@markStr )
begin
set @Value = @Value + @markStr; --如果字符串末尾没有所需的

标记时,就添加标记
end;
--打开游标得到列
OPEN getColumns;
Fetch next from getColumns into @columns;
while @@FETCH_STATUS = 0
begin
SELECT @postion=1,@TEMPid=0;
WHILE((@postion<=@strlen) and (@postion !=0))
BEGIN
IF(CHARINDEX(@markStr,@Value,@postion)!=0)
BEGIN
SET @sublen=CHARINDEX

(@markStr,@Value,@postion)-@postion;
END;
ELSE
BEGIN
SET @sublen=@strlen-@postion+1;
END;
IF(@postion<=@strlen)
BEGIN
SET @TEMPid=@TEMPid+1;
if(@Temp = '')
set @Temp = @columns + ' Like '+

'''%' +SUBSTRING(@Value,@postion,@sublen)+'%''';
else
begin
set @Temp = @Temp + ' OR ' +

@columns + ' Like ' + '''%' + SUBSTRING(@Value,@postion,@sublen) + '%''';
end;
IF(CHARINDEX(@markStr,@Value,@postion)!=0)
BEGIN
SET @postion=CHARINDEX

(@markStr,@Value,@postion)+1;
END;
ELSE
BEGIN
SET @postion=@postion+1;
END;
END;
END;
Fetch next from getColumns into @columns;
end;
close getColumns;
DEALLOCATE getColumns;
print(@Temp);
if(@Temp != '')
exec('Select * from ' + @TableName + ' Where ' + @Temp);
else
print('The table does not contain the listed characters');
END;
...全文
260 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
gzx嘻嘻嘻 2013-10-21
  • 打赏
  • 举报
回复
引用 14 楼 guozuxiang 的回复:
我把charindex换成了instr函数,然后修改如下,但是if那里报错,我想请问您像这种大段的begin-end不应该在mysql总出现吗
OPEN getColumns;
	Fetch next from getColumns into columns;
	while done = 0
	do
		SELECT postion=1,TEMPid=0;
		WHILE((postion<=strlen) and (postion !=0))
			
			IF(INSTR(markStr,Value,postion)!=0)
			  then
				SET sublen=instr(markStr,Value,postion)-postion; 
		
			ELSE
			BEGIN
				SET sublen=strlen-postion+1;
			END;
			IF(postion<=strlen)
			BEGIN
				SET TEMPid=TEMPid+1;
				if(Temp = '')
					set Temp = columns + ' Like '+ '''%' +SUBSTRING(Value,postion,sublen)+'%''';
				else
				begin
					set Temp = Temp + ' OR ' + columns + ' Like ' + '''%' + SUBSTRING(Value,postion,sublen) + '%''';
				end;
				IF(instr(markStr,Value,postion)!=0)
				BEGIN
					SET postion=instr(markStr,Value,postion)+1;
				END;
				ELSE
				BEGIN
					SET postion=postion+1;
				END;
			END;
		END;
		Fetch next from getColumns into columns;
	end; 
	close getColumns;
对了。第一个if那里报错了
gzx嘻嘻嘻 2013-10-21
  • 打赏
  • 举报
回复
我把charindex换成了instr函数,然后修改如下,但是if那里报错,我想请问您像这种大段的begin-end不应该在mysql总出现吗
OPEN getColumns;
	Fetch next from getColumns into columns;
	while done = 0
	do
		SELECT postion=1,TEMPid=0;
		WHILE((postion<=strlen) and (postion !=0))
			
			IF(INSTR(markStr,Value,postion)!=0)
			  then
				SET sublen=instr(markStr,Value,postion)-postion; 
		
			ELSE
			BEGIN
				SET sublen=strlen-postion+1;
			END;
			IF(postion<=strlen)
			BEGIN
				SET TEMPid=TEMPid+1;
				if(Temp = '')
					set Temp = columns + ' Like '+ '''%' +SUBSTRING(Value,postion,sublen)+'%''';
				else
				begin
					set Temp = Temp + ' OR ' + columns + ' Like ' + '''%' + SUBSTRING(Value,postion,sublen) + '%''';
				end;
				IF(instr(markStr,Value,postion)!=0)
				BEGIN
					SET postion=instr(markStr,Value,postion)+1;
				END;
				ELSE
				BEGIN
					SET postion=postion+1;
				END;
			END;
		END;
		Fetch next from getColumns into columns;
	end; 
	close getColumns;
wwwwb 2013-10-21
  • 打赏
  • 举报
回复
建议看看MYSQL的HELP,示例 CREATE PROCEDURE p_bluelive() -> BEGIN -> DECLARE done INT DEFAULT 0; -> DECLARE v_a INT; -> DECLARE cur1 CURSOR FOR SELECT distinct a FROM t_bluelive; -> DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -> -> OPEN cur1; -> FETCH cur1 INTO v_a; -> WHILE done=0 DO -> set @sqlstmt=concat('SELECT a,count(*) as N from t_bluelive wher e a=',v_a,' INTO OUTFILE \'',v_a,'.txt\''); -> PREPARE stmt1 FROM @sqlstmt; -> EXECUTE stmt1 ; -> DEALLOCATE PREPARE stmt1; -> FETCH cur1 INTO v_a; -> END WHILE; -> END; -> // 自行修改
gzx嘻嘻嘻 2013-10-21
  • 打赏
  • 举报
回复
后面是打开游标的部分,mssql的写法请看1楼的代码,我修改了下
OPEN getColumns;
	Fetch next from getColumns into columns;
	while @@FETCH_STATUS = 0
	begin
		SELECT postion=1,TEMPid=0;
		WHILE((postion<=strlen) and (postion !=0))
		BEGIN
			IF(CHARINDEX(markStr,Value,postion)!=0)
			BEGIN
				SET sublen=CHARINDEX(markStr,Value,postion)-postion; 
			END;
			ELSE
			BEGIN
				SET sublen=strlen-postion+1;
			END;
			IF(postion<=strlen)
			BEGIN
				SET TEMPid=TEMPid+1;
				if(Temp = '')
					set Temp = columns + ' Like '+ '''%' +SUBSTRING(Value,postion,sublen)+'%''';
				else
				begin
					set Temp = Temp + ' OR ' + columns + ' Like ' + '''%' + SUBSTRING(Value,postion,sublen) + '%''';
				end;
				IF(CHARINDEX(markStr,Value,postion)!=0)
				BEGIN
					SET postion=CHARINDEX(markStr,Value,postion)+1;
				END;
				ELSE
				BEGIN
					SET postion=postion+1;
				END;
			END;
		END;
		Fetch next from getColumns into columns;
	end; 
	close getColumns;
我将它放在了DELIMITER中,请问sql server中的@@FETCH_STATUS = 0在mysql是什么,还有代码的第一个begin报错,不知为何
wwwwb 2013-10-21
  • 打赏
  • 举报
回复
mysql 没有charIndex函数 `information_schema`.`COLUMNS` `information_schema`.`TABLES`系统表 建议看看MYSQL的HELP
wwwwb 2013-10-21
  • 打赏
  • 举报
回复
DELIMITER $$ DROP PROCEDURE IF EXISTS GetList $$ CREATE PROCEDURE GetList(IN TableName VARCHAR(50), OUT VALUE VARCHAR(1000)) BEGIN DECLARE `columns` VARCHAR(50) DEFAULT NULL; DECLARE Temp VARCHAR(80) DEFAULT NULL; DECLARE i INT DEFAULT NULL; DECLARE strCount INT DEFAULT NULL; DECLARE `VALUES` VARCHAR(8000) DEFAULT NULL; DECLARE SQLString VARCHAR(500) DEFAULT NULL; DECLARE ParmDefinition VARCHAR(500) DEFAULT NULL; DECLARE strlen INT DEFAULT NULL; DECLARE postion INT DEFAULT NULL; DECLARE markStr VARCHAR(100) DEFAULT NULL; DECLARE sublen INT DEFAULT NULL; DECLARE TEMPid INT DEFAULT NULL; DECLARE getColumns CURSOR FOR SELECT Sys.Columns.name FROM Sys.tables,Sys.Types,Sys.Columns WHERE sys.tables.object_Id = Sys.columns.object_Id AND Sys.Types.system_type_id = Sys.columns.system_type_id AND Sys.Types.Name LIKE '%char' AND Sys.tables.Name = SUBSTRING(TableName,charIndex('.',TableName)+1,(LEN(TableName)-charIndex('.',TableName))); SET Temp = ''; SET strCount = 0; SET strlen=LEN(VALUE); SET markStr=' '; IF(RIGHT(@VALUE,1)<>@markStr ) THEN SET @VALUE = @VALUE + @markStr; END IF; END$$ DELIMITER ;
gzx嘻嘻嘻 2013-10-21
  • 打赏
  • 举报
回复
我把游标的定义放在DELIMITER中了,没有报错,这样对吗?
gzx嘻嘻嘻 2013-10-21
  • 打赏
  • 举报
回复
试过了,谢谢5楼,还有后面的我定义了一个游标,用来存储可匹配的字符
DELIMITER $$
 DROP PROCEDURE IF EXISTS GetList $$
  create procedure GetList(in TableName VarChar(50),  
   out Value VarChar(1000))
 BEGIN
 DECLARE `columns` VARCHAR(50) DEFAULT NULL;
 DECLARE Temp VARCHAR(80) DEFAULT NULL;
 DECLARE    i INT DEFAULT NULL;
 DECLARE    strCount INT DEFAULT NULL; 
 DECLARE    `VALUES` VARCHAR(8000) DEFAULT NULL;
 DECLARE    SQLString VARCHAR(500) DEFAULT NULL;
 DECLARE    ParmDefinition VARCHAR(500) DEFAULT NULL;
 DECLARE    strlen INT DEFAULT NULL;
 DECLARE    postion INT DEFAULT NULL;
 DECLARE    markStr VARCHAR(100) DEFAULT NULL; 
 DECLARE    sublen INT DEFAULT NULL; 
 DECLARE    TEMPid INT DEFAULT NULL;
 END$$
 DELIMITER ; 
Declare getColumns CURSOR FOR
	SELECT Sys.Columns.name
		FROM Sys.tables,Sys.Types,Sys.Columns 
			WHERE sys.tables.object_Id = Sys.columns.object_Id 
				AND Sys.Types.system_type_id = Sys.columns.system_type_id 
				AND Sys.Types.Name like '%char'
				AND Sys.tables.Name = substring(TableName,charIndex('.',TableName)+1,(LEN(TableName)-charIndex('.',TableName)))
BEGIN
	SELECT Temp = '',strCount = 0,strlen=LEN(Value),markStr=' ';
	if(RIGHT(@Value,1)<>@markStr )
      then  

		set @Value = @Value + @markStr; --如果字符串末尾没有所需的标记时,就添加标记
	end if;
显示declare有错误和if有错误,我看mysql中if的用法就是if-then-endif啊,还有declare为什么又会报错呢
wwwwb 2013-10-21
  • 打赏
  • 举报
回复
5楼的代码已经测试通过,你试试
gzx嘻嘻嘻 2013-10-21
  • 打赏
  • 举报
回复
我是参考http://blog.csdn.net/budapest/article/details/8565955改的,他的没有用DELIMITER啊
wwwwb 2013-10-21
  • 打赏
  • 举报
回复
完整代码是什么?MYSQL不支持匿名块 DELIMITER $$ DROP PROCEDURE IF EXISTS tt$$ CREATE PROCEDURE tt() BEGIN DECLARE `columns` VARCHAR(50) DEFAULT NULL; DECLARE Temp VARCHAR(80) DEFAULT NULL; DECLARE i INT DEFAULT NULL; DECLARE strCount INT DEFAULT NULL; DECLARE `VALUES` VARCHAR(8000) DEFAULT NULL; DECLARE SQLString VARCHAR(500) DEFAULT NULL; DECLARE ParmDefinition VARCHAR(500) DEFAULT NULL; DECLARE strlen INT DEFAULT NULL; DECLARE postion INT DEFAULT NULL; DECLARE markStr VARCHAR(100) DEFAULT NULL; DECLARE sublen INT DEFAULT NULL; DECLARE TEMPid INT DEFAULT NULL; END$$ DELIMITER ;
gzx嘻嘻嘻 2013-10-21
  • 打赏
  • 举报
回复
declare columns varchar(50) default null;
declare	Temp varchar(8000) default null;
declare	i int default null;
declare	strCount int default null; 
declare   	values varchar(8000) default null;
declare	SQLString nvarchar(500) default null;
declare	ParmDefinition nvarchar(500) default null;
declare	strlen int default null;
declare	postion int default null;
declare	markStr varchar(100) default null; 
declare	sublen int default null; 
declare	TEMPid int default null;
按照网上的一些实例改的,不过报错说不需要后面的null,去掉default null又显示要加分号,可是我有分号啊,什么情况?
wwwwb 2013-10-21
  • 打赏
  • 举报
回复
自己动手做一下吧,有问题再问
wwwwb 2013-10-21
  • 打赏
  • 举报
回复
再次建议看看MYSQL的HELP,出错时看看MYSQL的示例 WHILE((postion<=strlen) and (postion !=0)) DO SELECT postion=1,TEMPid=0;-> SET postion=1; SET TEMPid=0; IF(postion<=strlen) THEN if(Temp = '') [color=#FF0000]THEN[/color WHILE ... DO END WHILE;结束
gzx嘻嘻嘻 2013-10-20
  • 打赏
  • 举报
回复
因为今晚就要交,所以比较急,可能没时间调试,哪位大神可以帮忙写下吗
ACMAIN_CHM 2013-10-20
  • 打赏
  • 举报
回复
参考一下MYSQL的手册中的例子,尝试一下自己先写一下,然后有什么问题可以把自己写的代码和错误信息一同贴出以供分析讨论。 MYSQL中对表名进行查询需要用到 prepare 语句

56,687

社区成员

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

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