-1

おはよう。私は SQL が初めてで、ストアド プロシージャに問題があります。まず、SQL 2008 を使用していますが、違いがあるかどうかはわかりません。だからここに私の問題があります。ストアド プロシージャを 2 回続けて、異なる値を渡して呼び出します (ところで、そのwith recompile部分を追加しただけです。役に立ちません)。

EXECUTE crstored.sp_hhcAllActivityInstreamLoop
            @measureVarIDName ='staticPayact6moID'
            ,@measureSuppVarIDName ='payact6moID'
            ,@measureDesc ='payact6moDesc'
            ,@measureSuppTable ='crsupp.payact6mo'
            WITH RECOMPILE;
            GO

EXECUTE crstored.sp_hhcAllActivityInstreamLoop
            @measureVarIDName ='staticJourneyID'
            ,@measureSuppVarIDName ='journeyID'
            ,@measureDesc ='journeyDesc'
            ,@measureSuppTable ='crsupp.journey'
            WITH RECOMPILE;
            GO

初めて呼び出すと、実行されます。2回目は次のようになります。

メッセージ 207、レベル 16、状態 1、行 20 列名 'staticJourneyID' が無効です。メッセージ 207、レベル 16、状態 1、行 20 列名 'staticJourneyID' が無効です。

それを修正するために、ストアド プロシージャを削除します。途中で再コンパイルして、パラメーターを取り込み、パラメーターの 1 つを使用して単純な選択を行うだけです。それを実行します。ストアド プロシージャを削除します。完全な手順を再コンパイルします。その後、2 番目の呼び出しで実行できます。ただし、現在は JourneyID 用にのみ実行するように設定されており、前に戻って payAct6mos 変数を呼び出す必要がある場合は、同じ削除、再コンパイル、実行のシナリオを実行する必要があります。誰か提案はありますか?私が今思いつく唯一のことは、同じコードの 2 つのコピーを別の名前で持つことです。私はそれを維持しなければならないのは嫌です。

また、それが違いを生むかどうかはわかりませんが、パラメーターの使用方法のために、コードをストアド プロシージャで囲むように言われました。

select @sqlcode=@sqlcode+'      type line of code here     '

ありがとう!


私の問題のフォローアップです。私はそれを考え出した。私が言ったように、私はSQLの初心者です。だから、私が削除していたテーブルが判明しました.SPで動的SQLを使用して削除していました。「通常の」SQL を使用してそれらをドロップするとすぐに、呼び出しは正常に実行されました。それがなぜなのかはわかりませんが、そこにあります。みんなの助けに感謝します。

4

1 に答える 1

4

これは憶測です。私の推測では、ストアド プロシージャの 2 番目の部分は動的 SQL を使用しているということです。の名前を使用して SQL ステートメントを作成しています@measureVarIDName

staticPayact6moIDは、参照しているテーブルに存在します。

staticJourneyIDがテーブルに存在しません。

つまり、2 番目の呼び出しで (少なくとも) 最初の引数を修正する必要があります。

于 2013-05-10T13:40:27.810 に答える