对存储过程参数SQL使用“IN”语句

时间:2013-03-07 00:23:34

标签: mysql sql

我有一个带有一个名为“@IDs”的输入参数的存储过程。这将从我的应用程序中填充,该应用程序将按以下格式填充它:'2,30,105'。此参数内的值的数量当然会有所不同(例如:有时@ID将为'100,2005,2,510')我的存储过程非常简单。我有一张叫做“人”的桌子。我正在尝试编写此查询:

Select * From Persons Where P_Id in (@IDs)  

P_ID是我表中的主键。我得到的错误是'将varchar值'2,3,4'转换为数据类型int时转换失败。'任何建议将不胜感激。感谢。

3 个答案:

答案 0 :(得分:1)

一种方法是使用动态SQL。那就是将SQL生成为字符串,然后执行它。

更简单的方法(可能)是使用like

where concat(', ', @IDS, ', ') like concat('%, ', id, ', %')

请注意,这会将分隔符放在表达式的开头和结尾,因此“10”将不匹配“11010”。

答案 1 :(得分:0)

1)显示您的代码。

2)您可能尝试将所有值作为一个参数传递。这不起作用。您必须将它们列为单独的参数,然后将它们作为单独的参数绑定。

是的,当in参数的数量可能发生变化时,这使得很难使用存储过程。

答案 2 :(得分:0)

你可能需要做一个准备好的陈述。想法是构建选择句子然后执行它。这是一个如何做的例子......

USE mydb;

DROP PROCEDURE IF EXISTS execSql;
DELIMITER //
CREATE PROCEDURE execSql (
                 IN sqlq VARCHAR(5000)
                  ) COMMENT 'Executes the statement'
BEGIN
  SET @sqlv=concat(concat('select abc from yourtable where abc in (',sqll),')');
  PREPARE stmt FROM @sqlv;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END //
DELIMITER ; 

只需更改要执行的查询。