0

我有一个带有一个名为“@IDs”的输入参数的存储过程。这是从我的应用程序中填充的,它将以以下格式填充它:'2、30、105'。这个参数里面的值的个数当然会有所不同(例如:有时@IDs 会是'100, 2005, 2, 510') 我的存储过程很简单。我有一张名为“Persons”的表。我正在尝试编写此查询:

Select * From Persons Where P_Id in (@IDs)  

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

4

3 回答 3

1

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

一种更简单的方法(也许)是使用like

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

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

于 2013-03-07T00:26:42.030 回答
0

1)显示您的代码。

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

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

于 2013-03-07T00:27:26.460 回答
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 ; 

只需更改要执行的查询即可。

于 2013-03-07T00:32:59.657 回答