背景:指定された名前のテンポラリテーブルで「stuff」するストアドプロシージャがあります。プロシージャは、テンポラリ・テーブルのスキーマを検査し、スキーマに応じて異なる「stuff」を実行するという点で一般的です。私はこれがちょっと変わっていることを理解していますが、それ以外のほとんどの状況で問題なく動作するので、私は変更したくありません....Temp Tableが存在しないときにTemp Tableが存在するとSQL Serverが判断するのはなぜですか?
私は一時テーブル用に2つの異なるスキーマを作成するストアドプロシージャ同じ名前。論理的には、IFのどのブランチに応じて1つの一時テーブルしか作成しません。問題はSPROCがSQL Serverによって確認されたとき、それはIFの両側評価しているように思えることです
だから、このSQLは失敗した(これはSQLの構文をチェックするなら意味があります。):
IF (1=1)
BEGIN
CREATE TABLE #test
(
a BIGINT NOT NULL,
b BIGINT NOT NULL
)
END
ELSE
BEGIN
CREATE TABLE #test
(
a BIGINT NOT NULL,
b BIGINT NOT NULL,
c BIGINT NOT NULL
)
END
--exec SomeProcedureWhichDoesStuffWith#Test
DROP TABLE #test
を次のエラーと
:SQLチェッカーを満たすように思わ
Msg 2714, Level 16, State 1, Line 14
There is already an object named '#test' in the database.
IFS内部のドロップテーブルのない組み合わせ(作成、テーブルのDDLの前または後に)。
どうすればいいですか?たとえば、構文チェックを行わないようにSQLに指示し、sprocをそのまま受け入れることはできますか?
はいありがとう。残念ながら、それはsprocのテーブルを作成しているので、同じバッチに入っていなければなりません(したがって、GOには行かない)。 –