首頁 > 軟體

MYSQL與SQLserver之間儲存過程的轉換方式

2022-11-28 22:02:35

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. 批次處理分隔符存在差異

GOdelimiter $$

3. 可直接替換的關鍵字

smalldatetimedatetime
moneyDECIMAL(18,4)
numericDECIMAL
max8000
isnullifnull
getdatenow
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 outputcall p1(hy_v1,hy_v2,@v3 output );

9. 建立臨時表的書寫方式存在區別

select 表欄位 into #臨時表名稱
from 正常表
CREATE TEMPORARY TABLE IF NOT EXISTS 臨時表名稱 AS
SELECT 表欄位名稱 FROM 表名稱;

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com