3

3 つのテーブルがあります。祖父母テーブル ID に孫テーブルのレコードがあるかどうかを確認する必要があります。はいの場合は、はいを返し、そうでない場合は、いいえを返します。これが私のストアドプロシージャです。間違った構文エラーが発生しました。私はストアドプロシージャが初めてです。私を助けてください。

CREATE PROCEDURE P_Check
   @PKG_ID INT,
   @S_ID INT,
   @FLAG VCHAR(10) OUT

   DECLARE IDS CURSOR LOCAL FOR SELECT S_ID FROM T1 WHERE P_ID = @PKG_ID
   OPEN IDS
   FETCH NEXT FROM IDS into @S_ID

   WHILE @@FETCH_STATUS = 0
   BEGIN
      SELECT * FROM T2 WHERE S_ID = @S_ID

      IF @@ROWCOUNT<>0
         @FLAG = 'YES'
         RETURN 
      ELSE
         @FLAG = 'NO'

      FETCH NEXT FROM IDS into @S_ID
   END

   CLOSE IDS
   DEALLOCATE IDS
4

2 に答える 2

3

これは複雑すぎるため、ここでカーソルを使用する必要はまったくなく、まったく不要です。

手順を次のように簡素化します。

CREATE PROCEDURE P_Check
   @PKG_ID INT,
   @S_ID INT,
   @FLAG CHAR(1) OUT
AS BEGIN
   IF EXISTS (SELECT * FROM T2 
              INNER JOIN T1 ON T2.S_ID = T1.S_ID WHERE P_ID = @PKG_ID)
      SET @FLAG = 'Y'
   ELSE
      SET @FLAG = 'N'
END

SQL Server を本格的に使用する場合は、カーソルとループを使用して行ごとに処理を行うという手続き的な考え方から離れ、効率的かつ生産的になるようにセットで考え始める必要があります。

于 2013-04-11T05:01:38.913 に答える