テーブル内のデータを更新するストアドプロシージャを作成しました。最初にテーブル全体を再ロードします。次に、いくつかのフィルタが適用されます。 (例:列 'Model'は 'W'に等しくなければならず、モデル 'B'のすべての行が削除されます。)これは、テーブルがロードされた後でそれぞれの個別のフィルタフィルタが適用された後、一部の列にはすべての行に同じ値が含まれます(他の値はフィルタ処理で削除されました)。これらの列は現在役に立たないので、削除したいと思います。ストアドプロシージャが作成する列の削除を拒否します
これはSQL Serverにとって問題があるようです。 SPを実行するコマンドが与えられると、それは最後のステップで削除されるはずの列が現在存在せず、実行を拒否することを示します。これは技術的には正しいですが、現在の列は存在しませんが、SP自体によって作成されます。
いくつかのモックアップコード:
CREATE PROCEDURE dbo.Procedure AS (
DROP TABLE dbo.Table
SELECT * INTO dbo.Table FROM dbo.View
INSERT INTO dbo.Log VALUES (GETDATE(),(SELECT COUNT(1) FROM dbo.Table))
DELETE FROM dbo.Table WHERE Model <> 'W'
INSERT INTO dbo.Log VALUES (GETDATE(),(SELECT COUNT(1) FROM dbo.Table))
ALTER TABLE dbo.Table DROP COLUMN Model
)
エラー・コードを実行:
[2016-09-02 12:25:20] [S0001][207] Invalid column name 'Model'.
をどのように私はこの問題を回避し、SPを実行するのですか?
エラーの原因は、 'dbo.Table'が存在するが、' Model '列がなく、procがコンパイルされているためです。 'ALTER TABLE'ステートメントは、列のないスキーマに対して検証され、失敗します。動的SQLでalterステートメントをラップすると、ステートメントが実行の直前に別々にコンパイルされるため、問題を回避できます。 –
@A。 Stam:正しい構文でスクリプトを修正する 'ALTER TABLE dbo.Table *** DELETE *** COLUMNモデル'をALTER TABLEに変更するdbo.Table *** DROP *** COLUMNモデル –