-2

質問とクイズの 2 つのテーブルがあります。

クイズは質問のコレクションです。

クイズの表は次のようになります。

QuizdId | QuestionId (NVARCHAR50)

  1      |   1,2,3,4,5
  2      |   6,7,8,9

質問テーブルには、主キー ID (整数)、質問、およびステータス フィールドがあります。

問題テーブルのすべての問題のステータスを更新する手順を書きたいと思います。

次のクエリは SQL コンソールで機能します

UPDATE questions SET ActiveStatus = 'X' 
WHERE FIND_IN_SET(ID, (SELECT QuestionIds from quiz where QuizId = 2)) > 0

ここでは 4 行が更新されます。

しかし、同じクエリをストアド プロシージャに入れてパラメータを指定して実行すると、機能しません。

ストアド プロシージャ コード:

CREATE DEFINER=`root`@`localhost` 
PROCEDURE `update_quiz_status`(IN `QuizId` INT, IN `Status` VARCHAR(1))
MODIFIES SQL DATA
SQL SECURITY INVOKER
UPDATE questions SET ActiveStatus = Status 
WHERE FIND_IN_SET(ID, (SELECT QuestionIds from quiz where QuizId = QuizId)) > 0

プロシージャに構文エラーはありません。

SQL コンソールからプロシージャを呼び出すと、次のエラーが表示されます。

call update_quiz_status(2,'X');

エラー : #1242 - サブクエリが複数の行を返します

クエリが SQL コンソールでは機能するのに、ストアド プロシージャでは機能しない理由がわかりません。

これを達成できる他の方法はありますか?つまり、SQL プロシージャによって特定のクイズの質問ステータスを更新します。

4

2 に答える 2