例如:-
Select * from test table where some_words IN("some1","some2")
那么在这个查询中,我该如何在存储过程中编写它,其中IN()
参数中传递的值是用户传递的值。
在存储过程中-
Create definer Test(In user_input)
Begin
Select* from table where some_words IN(user_input);
End
这里user_input只有一个值,我希望它可以接受逗号分隔的多个值,我该怎么做呢?
3条答案
按热度按时间ac1kyiln1#
可以按如下方式使用预准备语句:
此存储过程将逗号分隔列表作为参数。
要呼叫SP,请使用:
Demo here
umuewwlo2#
如果您使用的是SQL Server,我们可以尝试使用adventure数据库,内联表值函数对于优化非常重要。
https://www.sqlshack.com/sql-server-inline-table-valued-function/
对于这一点,如果输入值列表很小,我们可以使用动态T-SQL。
这将返回一个包含350行的结果集。
这个存储过程将in子句的逗号分隔列表作为参数。这可以通过检查@list是否为空以及更改动态T-SQL来增强。我将让您完成这些操作。
下面是一个调用存储过程的示例。
两个调用的输出相同(select与exec)。
q9rjltbz3#
预准备语句的问题在于它们会导致SQL注入。此代码包含以下部分:创建表,插入数据,检查有效列表并返回给定列表的数据。
有三个对存储过程的调用:sql注入、无效列表和有效列表。三个列表中有两个没有返回结果,因为我们的验证函数告诉程序不要执行正确的代码。请注意,我们使用的是FIND_IN_SET()函数,而不是IN()。后者无法正常工作。PersonId发生了隐式强制转换。
上一个查询的输出示例。