首先先放两个存储过程来进行对比
一、mysql存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `searchProduct`(
IN cone VARCHAR ( 30 ),
IN ctow VARCHAR ( 30 ),
IN page INT,
IN size INT
)
BEGIN
set @s='SELECT * FROM productclass where status=0';
-- if(pname is not null) and pname!=''
-- then set @s=concat(@s,' and product LIKE \'','%',pname,'%','\'');
-- end if;
if(cone is not null) and cone!=''
then set @s=concat(@s,' and class1 LIKE \'','%',cone,'%','\'');
end if;
if(ctow is not null) and ctow!=''
then set @s=concat(@s,' and class2 LIKE \'','%',ctow,'%','\'');
end if;
set @s=concat(@s,' ORDER BY class1,class2,class3,class4');
if(size>0) then
set @s=concat(@s,' limit ',(page-1)*size,',',size);
end if;
-- 拼接完成后可以调用 select @s 语句,查看最终拼接的sql语句是否正确
prepare stmt from @s;-- 预编译一条sql语句,并命名为stmt
execute stmt;-- 执行预编译sql
END
二、sqlserver存储过程
ALTER PROCEDURE [dbo].[searchProduct]
@cone VARCHAR ( 30 ),@ctow VARCHAR ( 30 ),@page INT,@size INT
AS
BEGIN
-- routine body goes here, e.g.
-- SELECT 'Navicat for SQL Server'
declare @s Nvarchar(MAX);
set @s='SELECT * FROM productclass where status=0';
-- if(pname is not null) and pname!=''
-- then set @s=concat(@s,' and product LIKE \'','%',pname,'%','\'');
-- end if;
if(@cone is not null) and @cone!=''
BEGIN
set @s=concat(@s,' and class1 LIKE ','''%',@cone,'%''');
END
if(@ctow is not null) and @ctow!=''
BEGIN
set @s=concat(@s,' and class2 LIKE ','''%',@ctow,'%''');
END
set @s=concat(@s,' ORDER BY class1,class2,class3,class4');
if(@size>0)
BEGIN
set @s=concat(@s,'( select top ',@size,' id from productclass
where id not in (
select top ', (@page-1)*@size,' id from productclass
))')
END
-- 拼接完成后可以调用 select @s 语句,查看最终拼接的sql语句是否正确
print(@s)
EXEC sp_executesql @s;
END
综合以上同一功能函数在不同的数据库中的规则不同,总结如下几点区别与相互之间的转换规则:
(1)对于输入参数来说
mysql使用IN cone VARCHAR ( 30 )
sqlserver使用@cone VARCHAR ( 30 )
注意对于参数在下面语句使用中,mysql可以直接使用名称,二sqlserver要加上@
符号
(2)对于语句的set
来说
mysql可以直接set 变量
sqlserver需要在之前事先声明变量
后才可以使用
(3)对于if语句
的执行
mysql使用if 过程 endif
sqlserver使用 if begin 过程 end
(4)对于定义sql语句的执行
mysql使用prepare stmt from @s; execute stmt;
进行预编译和执行
sqlserver使用EXEC sp_executesql @s
注意:sqlserver也可以使用exec(@s),这样的话变量声明一般是varchar类型,若使用sp_executesql必须是Nvarchar的定义类型,具体的区别可以自行百度查询