MySql存储过程不编译

问题描述 投票:-1回答:1
DELIMITER //

CREATE PROCEDURE SearchProduct(
    
    IN Search VARCHAR(1000),
    IN OrderBy Varchar(100),
    In FromId varchar(10),
    In ToId varchar(10)
    
    )

BEGIN

Set @MQuery= '
 with DataTable as (

    SELECT Product.Id as ProductId, 
           Category.Id as CategoryId,
           Product.Active,
           Product.Name as ProductName,
           Catgeory.Name as CategoryName,
           Product.AddedOn,
           Product.AddedBy as UserId, 
           ROW_NUMBER() OVER (Order by '+ OrderBy  +') RowNumber,
    Count(*) OVER() as TotalRecords 
    
    FROM Product
    inner join ProductCategory 
    on Product.Id=ProductCategory.ProductId
    inner join Category 
    on Category.Id= ProductCategory.CategoryId

WHERE ' + Search+ ' ) '+

'
Select DataTable.*, (User.FirstName+space(1) + User.LastName) as FullName

from DataTable 
inner join User on DataTable.UserId= User.Id
where DataTable.RownNumber berween '+FromId +' and '+ ToId
+ ' order by DataTable.RowNumber'

execute @MQuery;

 END //
 
DELIMITER ;

结果出现以下错误。

#1064 - 你的SQL语法有错误;检查你的MySQL服务器版本对应的手册,以了解在 "execute @MQuery.END "附近使用的正确语法。

在第17行的'execute @MQuery; END'附近的正确语法

mysql sql mysql-error-1064
1个回答
0
投票

在MySQL中连接字符串的正确方法是使用函数 concat(). 正确的执行方式是用 prepareexec.

而且,没有 with 语句在MySQL中。 你想写的语句是这样的。

Set @MQuery = concat('
 with DataTable as (

    SELECT Product.Id as ProductId, 
           Category.Id as CategoryId,
           Product.Active,
           Product.Name as ProductName,
           Catgeory.Name as CategoryName,
           Product.AddedOn,
           Product.AddedBy as UserId, 
           ROW_NUMBER() OVER (Order by '+ OrderBy  +') RowNumber,
    Count(*) OVER() as TotalRecords 

    FROM Product
    inner join ProductCategory 
    on Product.Id=ProductCategory.ProductId
    inner join Category 
    on Category.Id= ProductCategory.CategoryId

WHERE ', Search, ' ) ', 
'
Select DataTable.*, concat(User.FirstName, ' ', User.LastName) as FullName

from DataTable 
inner join User on DataTable.UserId= User.Id
where DataTable.RownNumber berween ', FromId, ' and ', ToId,
' order by DataTable.RowNumber' );

prepare stmt from @MQuery;

exec stmt;

这可能会被编译,但你会有其他问题。 你需要对MySQL的查询进行重组。 很明显,你没有尝试在写存储过程之前先运行查询。 这就像去赌博,把所有的钱都放在你玩的第一场游戏上。 这可能会成功,但不可能。

看起来你是把MySQL和SQL Server的语法混在一起了。

© www.soinside.com 2019 - 2024. All rights reserved.