简体   繁体   English

将MS-SQL Server存储过程转换为MySQL查询

[英]Convert MS-SQL Server stored procedure to MySQL Query

I am stuck at this for the past hour and unable to convert this MSSQL Server stored procedure to "MySQL query": 在过去的一个小时里,我一直处于这种状态,无法将此MSSQL Server存储过程转换为“ MySQL查询”:

DECLARE @LedgerTbl TABLE (PARTY_ID VARCHAR(100),VRDATE VARCHAR(200),
                          VRNOA VARCHAR(200),ETYPE VARCHAR(50),
                          DESCRIPTION VARCHAR(500),DEBIT DECIMAL,
                          CREDIT DECIMAL, RunningTotal decimal) 

DECLARE @RunningTotal decimal 

SET @RunningTotal = 0 

INSERT INTO @LedgerTbl 
SELECT PARTY_ID,VRDATE,DCNO VRNOA,ETYPE,DESCRIPTION,DEBIT,CREDIT, null 
FROM PLEDGER WHERE PARTY_ID=@partyId AND VRDATE BETWEEN @from AND @to 
ORDER BY VRDATE,ETYPE,VRNOA 

UPDATE @LedgerTbl 
SET @RunningTotal = RunningTotal = @RunningTotal + (DEBIT-CREDIT) 
FROM @LedgerTbl 

SELECT * FROM @LedgerTbl 

How may I convert this to a single MySQL query or a MySQL Stored procedure? 如何将其转换为单个MySQL查询或MySQL存储过程?

UPDATE UPDATE

I tried to transform it to but it is giving me these error that I have given below: 我试图将其转换为,但它给了我下面给出的这些错误:

DELIMETER //

CREATE PROCEDURE `Acc_Ledger` ()
BEGIN
    DECLARE RunningTotal DECIMAL;
    SET RunningTotal = 0;
    CREATE TEMPORARY TABLE LedgerTbl (PARTY_ID VARCHAR(100),VRDATE VARCHAR(200),VRNOA VARCHAR(200),ETYPE VARCHAR(50),DESCRIPTION VARCHAR(500),DEBIT DECIMAL,RTotal decimal);
    INSERT INTO LedgerTbl 
    SELECT PARTY_ID,VRDATE,DCNO VRNOA,ETYPE,DESCRIPTION,DEBIT,CREDIT, null 
    FROM PLEDGER WHERE PARTY_ID=17 AND VRDATE BETWEEN '2013/12/02' AND '2010/12/02' 
    ORDER BY VRDATE,ETYPE,VRNOA; 

    UPDATE LedgerTbl 
    SET RunninTotal = RTotal = RunningTotal + (DEBIT-CREDIT) 
    FROM LedgerTbl; 

    SELECT * FROM LedgerTbl;
END//
DELIMETER;

Here are the errors: 错误如下:

There seems to be an error in your SQL query. 您的SQL查询中似乎有一个错误。 The MySQL server error output below, if there is any, may also help you in diagnosing the problem 下面的MySQL服务器错误输出(如果有的话)也可以帮助您诊断问题

ERROR: Unknown Punctuation String @ 10 STR: // SQL: DELIMETER// 错误:未知标点字符串@ 10 STR:// SQL:DELIMETER //

CREATE PROCEDURE Acc_Ledger () BEGIN DECLARE RunningTotal DECIMAL;DELIMETER// CREATE PROCEDURE Acc_Ledger ()开始声明RunningTotal DECIMAL; DELIMETER //

CREATE PROCEDURE Acc_Ledger () BEGIN DECLARE RunningTotal DECIMAL;DELIMETER// CREATE PROCEDURE Acc_Ledger ()开始声明RunningTotal DECIMAL; DELIMETER //

CREATE PROCEDURE Acc_Ledger () BEGIN DECLARE RunningTotal DECIMAL;DELIMETER// CREATE PROCEDURE Acc_Ledger ()开始声明RunningTotal DECIMAL; DELIMETER //

CREATE PROCEDURE Acc_Ledger () BEGIN DECLARE RunningTotal DECIMAL;DELIMETER// CREATE PROCEDURE Acc_Ledger ()开始声明RunningTotal DECIMAL; DELIMETER //

CREATE PROCEDURE Acc_Ledger () BEGIN DECLARE RunningTotal DECIMAL;DELIMETER// CREATE PROCEDURE Acc_Ledger ()开始声明RunningTotal DECIMAL; DELIMETER //

CREATE PROCEDURE Acc_Ledger () BEGIN DECLARE RunningTotal DECIMAL;DELIMETER// CREATE PROCEDURE Acc_Ledger ()开始声明RunningTotal DECIMAL; DELIMETER //

CREATE PROCEDURE Acc_Ledger () BEGIN DECLARE RunningTotal DECIMAL;DELIMETER// CREATE PROCEDURE Acc_Ledger ()开始声明RunningTotal DECIMAL; DELIMETER //

CREATE PROCEDURE Acc_Ledger () BEGIN DECLARE RunningTotal DECIMAL; CREATE PROCEDURE Acc_Ledger ()开始Acc_Ledger十进制;

SQL query: SQL查询:

DELIMETER// CREATE PROCEDURE Acc_Ledger () BEGIN DECLARE RunningTotal DECIMAL; DELIMETER //创建过程Acc_Ledger ()开始Acc_Ledger DECIMAL;

MySQL said: Documentation MySQL说:文档

#1064 - You have an error in your SQL syntax; #1064-您的SQL语法有误; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMETER// 查看与您的MySQL服务器版本相对应的手册,以在'DELIMETER //附近使用正确的语法

CREATE PROCEDURE Acc_Ledger () BEGIN DECLARE RunningTotal' at line 1 在第1行上创建步骤Acc_Ledger ()开始声明RunningTotal'

Can anyone please review it? 任何人都可以查看它吗?

It seems that the MSSQL procedure calculates a running total, 看来,MSSQL过程会计算运行总计,
I've tested this procedure (slighly modified) on sqlfiddle and it gives the following results: 我已经在sqlfiddle上测试了此过程(稍作修改),它给出了以下结果:
http://www.sqlfiddle.com/#!6/0e909/1 http://www.sqlfiddle.com/#!6/0e909/1

The MSSQL procedure contains probably a typo here: SELECT PARTY_ID,VRDATE,DCNO VRNOA,ETYPE, it's not clear whether DCNO VRNOA are two separate columns, or maybe one column DCNO_VRNOA with "missing" underscore between them. MSSQL过程可能在此处包含一个拼写错误: SELECT PARTY_ID,VRDATE,DCNO VRNOA,ETYPE,尚不清楚DCNO VRNOA是两个单独的列,还是一个DCNO_VRNOA列, DCNO_VRNOA带有下划线。
I assume that they are two separate columns. 我假设它们是两个单独的列。

To calculate a running total in MySql there is no need to use a temporary table. 要在MySql中计算运行总计,无需使用临时表。
This simple query does this task: 这个简单的查询可以完成以下任务:

SELECT PARTY_ID,VRDATE,DCNO, VRNOA,ETYPE,DESCRIPTION,
       DEBIT,
       CREDIT, 
       @RunningTotal := @RunningTotal + (DEBIT-CREDIT) RunningTotal 
FROM PLEDGER ,
     ( SELECT @RunningTotal:=0) init_variables
WHERE PARTY_ID=1 
  AND VRDATE BETWEEN '2013-11-11' AND '2013-11-11'
ORDER BY VRDATE,ETYPE,VRNOA; 

See demo here: --> http://www.sqlfiddle.com/#!2/daa6e/1 在此处查看演示:-> http://www.sqlfiddle.com/#!2/daa6e/1

The procedure might look like: 该过程可能类似于:

DELIMITER /
CREATE PROCEDURE `Acc_Ledger` ()
BEGIN
    SELECT PARTY_ID,VRDATE,DCNO, VRNOA,ETYPE,DESCRIPTION,
           DEBIT,
           CREDIT, 
           @RunningTotal := @RunningTotal + (DEBIT-CREDIT) RunningTotal 
    FROM PLEDGER ,
         ( SELECT @RunningTotal:=0) init_variables
    WHERE PARTY_ID=1 
      AND VRDATE BETWEEN '2013-11-11' AND '2013-11-11'
    ORDER BY VRDATE,ETYPE,VRNOA; 
END /
DELIMITER ;

I had to write this procedure on my own, here is the link that helped me understand the Stored Procedures in MySQL: http://net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/ . 我必须自己编写此过程,下面的链接可帮助我了解MySQL中的存储过程: http : //net.tutsplus.com/tutorials/an-introduction-to-stored-procedures/ And the procedure that I came up wit 而我机智的程序

DROP PROCEDURE IF EXISTS `Acc_Ledger`;

DELIMITER //

CREATE PROCEDURE `Acc_Ledger` ()
BEGIN
    DECLARE RunningTotal, deb, cred DECIMAL(19,2);
    DECLARE counter, row_count int;

    SET RunningTotal = 0;
    SET counter = 1;

    DROP TABLE IF EXISTS LedgerTbl;

    CREATE TEMPORARY TABLE LedgerTbl (CTR int primary key auto_increment, PARTY_ID INT,VRDATE VARCHAR(200),VRNOA VARCHAR(200),ETYPE VARCHAR(50),DESCRIPTION VARCHAR(500),DEBIT DECIMAL(19,2),CREDIT DECIMAL(19,2),RTotal DECIMAL(19,2));

    INSERT INTO LedgerTbl
    SELECT 0, PARTY_ID,VRDATE,DCNO,ETYPE,DESCRIPTION,DEBIT,CREDIT, null FROM PLEDGER WHERE PARTY_ID=17 AND VRDATE BETWEEN '2010/10/02' AND '2013/12/02' 
    ORDER BY VRDATE,ETYPE,DCNO;

    SELECT COUNT(*) INTO row_count FROM LedgerTbl;

    WHILE counter <= row_count DO

        SELECT debit INTO deb FROM LedgerTbl WHERE ctr = counter;
        SELECT credit INTO cred FROM LedgerTbl WHERE ctr = counter;
        SET RunningTotal = RunningTotal + (deb-cred);

        UPDATE LedgerTbl 
        SET LedgerTbl.RTotal = RunningTotal
        WHERE ctr = counter;  

        SET counter = counter + 1;

    END WHILE;

    SELECT * FROM LedgerTbl;
END//
DELIMITER ;

UPDATE UPDATE

Now I found the comparatively efficient solution: 现在我找到了比较有效的解决方案:

DROP PROCEDURE IF EXISTS `Acc_Ledger`;

DELIMITER //

CREATE PROCEDURE `Acc_Ledger` ()
BEGIN
    DECLARE RunningTotal, deb, cred DECIMAL(19,2);
    DECLARE counter, row_count int;

    SET RunningTotal = 0;
    SET counter = 1;

    DROP TABLE IF EXISTS LedgerTbl;

    CREATE TEMPORARY TABLE LedgerTbl (CTR int primary key auto_increment, PARTY_ID INT,VRDATE VARCHAR(200),VRNOA VARCHAR(200),ETYPE VARCHAR(50),DESCRIPTION VARCHAR(500),DEBIT DECIMAL(19,2),CREDIT DECIMAL(19,2),RTotal DECIMAL(19,2));

    INSERT INTO LedgerTbl
    SELECT 0, PARTY_ID,VRDATE,DCNO,ETYPE,DESCRIPTION,DEBIT,CREDIT, null FROM PLEDGER WHERE PARTY_ID=17 AND VRDATE BETWEEN '2010/10/02' AND '2013/12/02' 
    ORDER BY VRDATE,ETYPE,DCNO;

    SELECT COUNT(*) INTO row_count FROM LedgerTbl;

    SET @RunningTotal := 0;

    UPDATE LedgerTbl 
    SET RTotal = (@RunningTotal := @RunningTotal + (DEBIT - CREDIT));

    SELECT * FROM LedgerTbl;
END//
DELIMITER ;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM