浅谈 sqlserver 和 mysql存储过程、函数的区别

本文作者在将公司数据库从sqlserver迁移到mysql的过程中,对比了两者在存储过程和函数上的区别,包括参数定义、变量声明、游标使用以及动态SQL组装等方面的差异。总结了sqlserver和mysql在语法和功能上的不一致,强调了迁移过程中需要注意的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实我不太喜欢搞数据库,平常也就是用用select、insert。这次公司要把数据库从sqlserver迁到mysql,我也试着改了几个存储过程,在此总结。首先吐槽一句,sqlserver和

mysql差别还真大!


区别一:存储过程入参

USE [LearningReport_de]
GO
                                                                                                                              
SET ANSI_NULLS ON                                                                                                             
GO                                               DELIMITER $$                                                                 
SET QUOTED_IDENTIFIER ON                                                                                                      
GO                                               USE `LearningReport_de`$$                                                    

ALTER PROCEDURE [dbo].[wsGetLL1]                 DROP PROCEDURE IF EXISTS `wsGetLL1`$$                                        
    @Child_id bigint,                                                                                                         
    @Part_number nchar(17)                       CREATE  PROCEDURE `wsGetLL1`(IN Child_id BIGINT(19), IN Part_number NCHAR(17)
                                                     BEGIN                                                                    
AS                                                   	                                                                        
BEGIN                                                END$$                                                                    
                                                                                                                              
END                                              DELIMITER ;                                                                  
                                                                                                                              
                                                                                                                              

这是存储过程的结构,sqlserver中全都是GO 什么的,这些在mysql都没有。但是需要注意的的是mysql的默认结束符是 “;”,所以要重新修改结束符。

存储过程可以传入参数,但是sqlserver和mysql的定义形式完全不一样。sqlserver中的入参在begin之前,而mysql的入参和C语言类似,函数名后面加个括号,而且用IN / 

OUT 来标识传入和传出,在这个地方就可以看得出来,sqlserver和mysql定义变量的方法也不同,后面会讲到。


区别二:定义变量

DECLARE @Product_number bigint          	DECLARE Product_number BIGINT;
DECLARE @sSQL nvarchar(1000)            	DECLARE sSQL NVARCHAR(1000);
DECLARE @Country_index nchar(2)         	DECLARE Country_index NCHAR(2);
DECLARE @LL0_table nvarchar(50)         	DECLARE LL0_table NVARCHAR(50);
DECLARE @LL1_table nvarchar(50)         	DECLARE LL1_table NVARCHAR(50);

sqlserver中的变量都是用@开头的,以后使用也需要@,而mysql没有,我觉得这点sqlserver还是不错,以为后面很多地方变量和列名会混乱。除此之外,sqlserver不需要

标点,而mysql是典型的";"结尾。另外sqlserver中有bit类型,而mysql中没有,一般用bool 或者tinyint代替。


区别三:游标

sqlserver和mysql的定义游标是完全一样的,只不过在sqlserver中游标的声明可以在任何地方,而mysql中的游标声明只能在最前面。sqlserver在遍历游标时用了内置变量

@@FETCH_STATUS,而mysql需要自己定义,不管哪种,二重循环变量


DECLARE ProductCursor cursor for                                    DECLARE ProductCursor CURSOR FOR                            
    SELECT roduct_number FROM vuChildProductByCountry                       SELECT product_number FROM vuChildProductByCountry; 
                                                                    DECLARE CONTINUE HANDLER FOR NOT FOUND SET fetch_status = 0;
    OPEN ProductCursor                                                                                                          
    FETCH NEXT FROM ProductCursor into @Product_number              SET fetch_status = 1;                                       
    WHILE @@FETCH_STATUS = 0                                        OPEN ProductCursor;                                         
      BEGIN                                                                                                                     
                                                                    FETCH  FROM ProductCursor INTO Product_number;              
        FETCH NEXT FROM ProductCursor into @Product_number          REPEAT                                                      
      END                                                                IF fetch_status THEN                                     
    CLOSE ProductCursor                                                                                                         
    DEALLOCATE ProductCursor                                	         END IF;                                                  
                                                            	                                                                  
                                                            	         FETCH NEXT FROM ProductCursor INTO Product_number;       
                                                            	    UNTIL NOT fetch_status END REPEAT;                           
                                                                    CLOSE ProductCursor;     

由此可见,mysql中使用游标时还需另外声明 DECLARE CONTINUE HANDLER FOR NOT FOUNT SET fetch_status=0,这句表明,当游标到末尾时fetch_status的值就是0,

所以在repeat遍历的时候用until not fetch_status,sqlserver最后还需要用 DEALLOCATE ProductCursor来关闭游标。


三、组装sql语句

sqlserver太简单了,直接+就可以了, 但mysql不然,只能每次用concat一点一点拼接。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值