接受参数中包含多个值的字符串的MySQL存储过程

接受参数中包含多个值的字符串的MySQL存储过程,mysql,stored-procedures,Mysql,Stored Procedures,我想要调用存储过程的最佳方法,在这个过程中,我在单个参数中有多个值,比如City参数,它的值有‘london’、‘lyon’、‘kln’等等 我的存储过程是这样的 CREATE PROCEDURE `GetCityEmpData`(IN `City` VARCHAR(64)) BEGIN SELECT * FROM Employees WHERE Employees.City in (City); END call GetCityEmpData("'London',Lyon'"

我想要调用存储过程的最佳方法,在这个过程中,我在单个参数中有多个值,比如City参数,它的值有‘london’、‘lyon’、‘kln’等等

我的存储过程是这样的

CREATE PROCEDURE `GetCityEmpData`(IN `City` VARCHAR(64))
BEGIN 
   SELECT * FROM Employees 
   WHERE Employees.City in (City);
END
call GetCityEmpData("'London',Lyon'") ;
这样称呼它

CREATE PROCEDURE `GetCityEmpData`(IN `City` VARCHAR(64))
BEGIN 
   SELECT * FROM Employees 
   WHERE Employees.City in (City);
END
call GetCityEmpData("'London',Lyon'") ;
它返回0行,其中包含给定参数的数据。 是否可以在不使用prepare语句的情况下执行相同的操作?

您可以尝试以下操作:

CREATE PROCEDURE `GetCityEmpData`(`City` VARCHAR(64))
BEGIN
   set @query = concat("SELECT * FROM Employees 
                        WHERE Employees.City in (" , City , ")");

    PREPARE stmt FROM @query;
    EXECUTE stmt ;
END
然后,您可以根据需要调用您的过程:

call GetCityEmpData("'London','Lyon'") ;
你可以试试这个:

CREATE PROCEDURE `GetCityEmpData`(`City` VARCHAR(64))
BEGIN
   set @query = concat("SELECT * FROM Employees 
                        WHERE Employees.City in (" , City , ")");

    PREPARE stmt FROM @query;
    EXECUTE stmt ;
END
然后,您可以根据需要调用您的过程:

call GetCityEmpData("'London','Lyon'") ;

您可以使用find_in_set方法完成此操作

CREATE PROCEDURE `GetCityEmpData`(IN `City` VARCHAR(64))
BEGIN 
   SELECT * FROM Employees 
   WHERE FIND_IN_SET (Employees.City ,City);
END
就这样说吧

call GetCityEmpData('London,Lyon');

您可以使用find_in_set方法完成此操作

CREATE PROCEDURE `GetCityEmpData`(IN `City` VARCHAR(64))
BEGIN 
   SELECT * FROM Employees 
   WHERE FIND_IN_SET (Employees.City ,City);
END
就这样说吧

call GetCityEmpData('London,Lyon');


在这里,当您将参数传递给过程“'London',Lyon'”时,它的take整字符串不是逗号分隔的,这就是它的0行的原因。有什么解决方案来解决它吗?如果我删除双引号,它将作为2个参数并抛出错误。您应该在不调用时间的过程中删除它。我在过程中没有给出任何双引号。你们能根据我的问题给出一个例子吗?这里当你们把参数传递给程序“'London',Lyon'”时,它的整个字符串都不带逗号,这就是为什么它是0行。有什么解决方案吗?如果我删除双引号,它将作为2个参数并抛出错误。你应该在不调用时间的过程中删除它。我在过程中没有给出任何双引号。您能根据我的问题给出一个示例吗?这是执行存储过程的唯一方法吗?请提出其他解决方案。这没什么错。我只是想知道还有其他选择吗?这个解决方案对我很有效,但几秒钟后它就会抛出以下错误“查找错误-MySQL数据库错误:超时已过期。操作完成前超时时间已过,或者服务器没有响应。”如何解决这个问题有什么帮助吗?这个解决方案很容易被SQL注入使用,但要更加小心:)这是执行存储过程的唯一方法吗?请提出其他解决方案。这没什么错。我只是想知道还有其他选择吗?这个解决方案对我很有效,但几秒钟后它就会抛出以下错误“查找错误-MySQL数据库错误:超时已过期。操作完成前超时时间已过,或者服务器没有响应。”任何关于如何解决此问题的帮助。此解决方案倾向于更谨慎地使用SQL注入:)这应该是公认的答案。动态构建SQL会带来麻烦。如果我们编写参数化查询,动态构建SQL并没有那么糟糕。但是在用concat方法写了之后,我发现我的手很脏:)这应该是公认的答案。动态构建SQL会带来麻烦。如果我们编写参数化查询,动态构建SQL并没有那么糟糕。但在使用concat方法编写之后,我发现我的手很脏:)