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中连接字符串的正确方法是使用函数 concat()
. 正确的执行方式是用 prepare
exec
.
而且,没有 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的语法混在一起了。