0

「@IDs」という 1 つの入力パラメータを持つストアド プロシージャがあります。これは、「2、30、105」の形式で入力されるアプリケーションから入力されます。もちろん、このパラメーター内の値の数は異なります (たとえば、@ID が「100、2005、2、510」になることがあります)。私のストアド プロシージャは非常に単純です。「Persons」というテーブルがあります。私はこのクエリを書き込もうとしています:

Select * From Persons Where P_Id in (@IDs)  

P_ID は私のテーブルの主キーです。表示されるエラーは、「varchar 値 '2、3、4' をデータ型 int に変換するときに変換に失敗しました」です。どんな提案でも大歓迎です。ありがとう。

4

3 に答える 3

1

1 つの方法は、動的 SQL を使用することです。つまり、SQL を文字列として生成し、それを実行します。

(おそらく)より簡単な方法は、次を使用することlikeです。

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

これにより、セパレータが式の最初と最後に配置されるため、「10」は「11010」と一致しないことに注意してください。

于 2013-03-07T00:26:42.030 に答える
0

1) コードを表示します。

2) すべての値を 1 つのパラメーターとして渡そうとした可能性があります。それはうまくいきません。それらを個別のパラメーターとしてリストしてから、個別のパラメーターとしてバインドする必要があります。

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 に答える