MYSQL与SQLserver之间存储过程的转换方式
作者:AI_Frank 发布时间:2024-01-26 20:52:53
标签:MYSQL,SQLserver,存储过程
MYSQL与SQLserver之间存储过程的转换
首先先放两个存储过程来进行对比
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的定义类型,具体的区别可以自行百度查询
SQLserver转MYSQL存储过程的经验
总体来说,sql sever和Mysql的存储过程的思路都是一样的,但是在语法和结构上还是有很大的区别的,可以使用如下的转换方式。
1. 存储过程的定义方式存在区别
CREATE proc p1 aa int bb varchar(255) output as | CREATE PROCEDURE p1( in aa int, out bb varchar(255) ) begin statement_list end; |
2. 批处理分隔符存在差异
GO | delimiter $$ |
3. 可直接替换的关键字
smalldatetime | datetime |
money | DECIMAL(18,4) |
numeric | DECIMAL |
max | 8000 |
isnull | ifnull |
getdate | now |
dbo. |
4. select语句起别名的方式有区别
select 'sunday' day; | SELECT 'sunday' AS day; |
5. if语句的结构存在区别
if condition statement else statement | if condition then statement else statement end if; |
6. cast语句的目标类型存在区别
目标类型可以是任意类型 | 目标类型可以是以下类型之一:BINARY,CHAR,DATE,DATETIME,TIME,DECIMAL,SIGNED,UNSIGNED |
7. 动态SQL执行语句的书写方式存在区别
exec(@sql) | PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; |
8. 调用其它存储过程的方式存在区别
exec p1 @v1,@v2,@v3 output | call p1(hy_v1,hy_v2,@v3 output ); |
9. 创建临时表的书写方式存在区别
select 表字段 into #临时表名称 from 正常表 | CREATE TEMPORARY TABLE IF NOT EXISTS 临时表名称 AS SELECT 表字段名称 FROM 表名称; |
来源:https://blog.csdn.net/qq_30653631/article/details/105832406
0
投稿
猜你喜欢
- 大家可能有这样的体验,好比在程序里面我明明写了app.run(port=8001),结果程序还是在5000端口输出,我们右键点击py程序,直
- 上篇文章给大家介绍了Mysql带And关键字的多条件查询语句,下面给大家介绍MySql带OR关键字的多条件查询语句,感兴趣的朋友可以一起学习
- 本文实例为大家分享了opencv+python实现图像矫正的具体代码,供大家参考,具体内容如下需求:将斜着拍摄的文本图像进行矫正python
- 背景:有一个爬虫服务,需要定时从公开网站上拉取一些数据,为了避免被识别为爬虫(防爬虫的识别需要根据很多特征,时间仅仅是其中一个维度),需要在
- PEP 3107引入了功能注释的语法,PEP 484 加入了类型检查标准库 typing 为类型提示指定的运行时提供支持。示例:def f(
- '''数据集:伪造数据集(两个高斯分布混合)数据集长度:1000--------------------------
- 最近,正好发生了一件大事,就是 GitLab 的运维同学不小心删除了生产的数据,虽然 GitLab 已经骇人听闻的准备了五种备份机制,但是,
- <?php //作者:遥远的期待 //QQ:15624575 //算法分析:1、必须是整数序列、2、如果整个序列不全是负数,最大子序列
- 文本如图:Python:import sysresult=[]with open('accounts.txt','r
- 如下所示:#coding=utf-8#方式一print('*'*20 + '方式一' + '*
- 前言不知各位朋友现在在 web 端进行登录的时候有没有注意一个变化,以前登录的时候是直接账号密码通过就可以直接登录,再后来图形验证码,数字结
- 本节描述openGauss数据库在虚拟机VirtualBox+openEuler上的安装配置。1、虚拟机VirtualBox下载及安装步骤
- 相对于Java方式的聊天室,Python同样可以做得到。而且可以做的更加的优雅。想必少了那么多的各种流的Python Socket,你一定会
- Selenium中的鼠标和键盘事件被封装在ActionChains类中,使用方法:ActionChains(driver).click(bt
- 在网络设计领域关于Eye-Tracking的研究十分火爆,但是如何把这些研究结果转变为具体可行的设计来运作依旧是个难点。以下就是一些来自于E
- 1.触发器概述触发器是SQL Server数据库应用中一个重要工具,是一种特殊类型的存储过程,应用非常广泛。一般存储过程主要通过存储过程名而
- 前记上一遍文章《Python中Async语法协程的实现》介绍了Python是如何以生成器来实现协程的以及Python Asyncio通过Fu
- express中常见的路由规则主要使用的路由规则是get和post两种,即var express = require('expres
- 1. 循环require在JavaScript中,模块之间可能出现相互引用的情况,例如现在有三个模块,他们之间的相互引用关系如下,大致的引用
- 大家都知道搜索引擎比较喜欢H1。在SEO中H1也是很基础也很重要的一步。但有些时候为了界面风格的原因,很多标题性的文字做成了图片。大多数情况