我有一个带有一个名为“@IDs”的输入参数的存储过程。这将从我的应用程序中填充,该应用程序将按以下格式填充它:'2,30,105'。此参数内的值的数量当然会有所不同(例如:有时@ID将为'100,2005,2,510')我的存储过程非常简单。我有一张叫做“人”的桌子。我正在尝试编写此查询:
Select * From Persons Where P_Id in (@IDs)
P_ID是我表中的主键。我得到的错误是'将varchar值'2,3,4'转换为数据类型int时转换失败。'任何建议将不胜感激。感谢。
答案 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 ;
只需更改要执行的查询。