2016-06-21 82 views
1

我将此SP用于MsSQL。我如何将其转换为MySql?使用@variable将MSsQL转换为MySql存储过程

由于语法错误,它不允许我创建过程。

目标是从这样的用户接收字符串: (ReportId,UserName) - 如果在变量中找到,则发回允许其他发送回访问被拒绝。

谢谢。

Procedure [dbo].[Permission] 
@ReportId As Int 
,@UserName As Varchar(50) 
As 
Declare 
    @Result As Varchar(250) 

Select 
    @Result = IsNull((
     Select 
      IsNull([permission].[Message], '') 

     From 
      [permission] 
      Join 
      [users] 
       On [users].[ID] = [permission].[User ID] 

     Where 
      [users].[User Name] = @UserName 
      And [permission].[Report ID] = @ReportId 
    ), 'Access denied') 


Select 
    Case 
     When @Result = '' Then 'Allowed' 
     Else @Result 
    End [Result] 

回答

1

不全面的清单,但:

  • 删除@符号,这些都是为会话变量;或者,您可能希望用某种标准化前缀替换它们,以防止与表格中的字段名称混淆。
  • 更换[]与`
  • IsNull时做的任务,像SELECT @Result = IsNull(...,改变成为IfNull
  • =:=

此外,结束您的语句与;,我不知道为什么有这么多MSSQL用户喜欢跳过它们。

对于一般创建proc语法,请转到CREATE PROCEDURE

+0

这是也有帮助 - 干杯! – joell

0

我翻译你的SP到MySQL语法:

DELIMITER $$ 
DROP PROCEDURE if exists Permission$$ 
CREATE PROCEDURE Permission(
    p_ReportId Int, 
    p_UserName Varchar(50) 
    ) 
BEGIN 
    set @Result = ''; 

    set @Result = 
    coalesce(
     (Select 
      coalesce(permission.Message, '') 
     From permission Inner Join users 
      On users.ID = permission.`User ID` 
     Where 
      users.`User Name` = p_UserName 
      And permission.`Report ID` = p_ReportId) 
     , 'Access denied'); 


    Select 
     Case 
      When @Result = '' Then 'Allowed' 
      Else @Result 
     End as Result; 
END $$ 

delimiter ; 
+0

谢谢,完美无缺地工作! – joell

+0

@joell你能将我的答案标记为“已接受”吗?这将帮助我提高声誉并继续帮助用户。 –