将SQL-Server代码转换为MySQL时出现问题

时间:2017-04-19 06:00:10

标签: mysql sql sql-server cursor sp-send-dbmail

我从SQL-Server版本稍微修改了以下代码。我需要帮助将其转换为MySQL。目前我收到错误:"你的SQL语法有错误;检查与DECLARE @ first_n'附近的MySQL服务器对应的手册。在第1行"。

DECLARE 
@out_desc AS VARCHAR(1000),
@out_mesg AS VARCHAR(100)

DECLARE @first_name AS VARCHAR(50),
@email AS NVARCHAR(50),
@body AS NVARCHAR(200)

DECLARE @birth_date AS DATETIME

DECLARE C1 CURSOR READ_ONLY
FOR
SELECT first_name, birth_date, email
FROM emp_master

OPEN C1
FETCH NEXT FROM C1 INTO
@first_name, @birth_date, @email
WHILE @@FETCH_STATUS = 0
BEGIN
  IF DATEPART(DAY,@birth_date) = DATEPART(DAY,GETDATE())
  AND DATEPART(MONTH,@birth_date) = DATEPART(MONTH,GETDATE())
  BEGIN
    SET @body = '<b>Happy Birthday ' + @first_name +
    '</b><br />Many happy returns of the day'
    + '<br /><br />Customer Relationship Department'
    EXEC sp_send_mail
    'pradeep.y@csmsoftware.com',
    @email,
    'Birthday Wishes',
    @body,
    'htmlbody',
    @output_mesg = @out_mesg output,
    @output_desc = @out_desc output

    PRINT @out_mesg
    PRINT @out_desc
  END
  FETCH NEXT FROM C1 INTO
  @name, @birthdate, @email
END
CLOSE C1
DEALLOCATE C1

2 个答案:

答案 0 :(得分:1)

由于您要使用MySQL,因此每个语句都需要一个终结符。这通常是一个分号。例如,您的第一个陈述将成为:

DECLARE
@out_desc AS VARCHAR(1000),
@out_mesg AS VARCHAR(100);
#------ look here -------^

此外,虽然你的代码的其他方面可能没问题(我没有检查过,很少使用游标),但是过滤掉你插入到游标中的内容而不是在其中具有以下条件是有意义的。环

IF DATEPART(DAY,@birth_date) = DATEPART(DAY,GETDATE())
AND DATEPART(MONTH,@birth_date) = DATEPART(MONTH,GETDATE())

虽然有相似之处,但有些SQL-Server代码与MySQL完全不同。特别是,我不认为sp_send_mail是有效的,我认为MySQL“等效”并不相似。

我无法提供进一步的帮助,将其从sql-server语法转换为MySQL。您需要逐行检查代码并搜索任何不起作用的MySQL等效项。一次添加一个部分,看看代码是否可以正常运行。当您收到错误时,请在Google上搜索“MySQL等效于SQL-server X”,其中X表示无效。

如果它设法发送电子邮件,或许您不是很期待它,请不要使用预期的收件人电子邮件地址,直到您确信所有错误都已被解决。硬编码到您自己的电子邮件地址(在选择CURSOR中,以便您可以看到WHILE循环中的关联部分正在运行。

答案 1 :(得分:0)

您可能需要更正此

     FETCH NEXT FROM C1 INTO
    @name, @birthdate, @email

 FETCH NEXT FROM C1 INTO
  @first_name, @birth_date, @email

@name,@ birthdate未声明