2016-09-02 18 views
2

テーブル内のデータを更新するストアドプロシージャを作成しました。最初にテーブル全体を再ロードします。次に、いくつかのフィルタが適用されます。 (例:列 '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を実行するのですか?

+0

エラーの原因は、 'dbo.Table'が存在するが、' Model '列がなく、procがコンパイルされているためです。 'ALTER TABLE'ステートメントは、列のないスキーマに対して検証され、失敗します。動的SQLでalterステートメントをラップすると、ステートメントが実行の直前に別々にコンパイルされるため、問題を回避できます。 –

+0

@A。 Stam:正しい構文でスクリプトを修正する 'ALTER TABLE dbo.Table *** DELETE *** COLUMNモデル'をALTER TABLEに変更するdbo.Table *** DROP *** COLUMNモデル –

答えて

2

私が正しく理解していれば、あなたは、動的SQLを使用することができます。

exec sp_executesql 'ALTER TABLE dbo.Table DROP COLUMN Model'; 
+0

これはエラーなしでコンパイルされます。結果を確認するために今手順をテストしています。 –

+0

プロシージャが正常に実行されました。しかし、私は次のようにクエリをフォーマットしなければなりませんでした: 'DECLARE @sql nvarchar(100)= 'ALTER TABLE dbo.Table DROP COLUMN Model'; EXEC sp_executesql @ sql'を実行します。何らかの理由で、sp_executesqlは、単に例のように文字列を引数として受け入れません。 –

0

あなたは列「モデル」のexistencyのための1つのより多くの時間がビューに存在し確認することができます。 SQL Serverののテーブルから任意の列を削除する

私は同じシナリオと私のためにその作品を試してみましたので...

enter image description here

+0

[モデル]列がビューに存在します。スクリプトをもう一度実行しても、それでも動作しますか?初めてスクリプトを実行するときは、既にテーブルから列を削除していない可能性があるので、それはうまくいくはずです。 –

+0

@ A. Stam:テーブルが落ちてきて毎回再作成されるたびに?? VIEWが表に依存しているとは言及されていない。だから問題はありません。 –

1

構文は、この5月

ALTER TABLE TableName DROP COLUMN ColumnName ; 

です問題の原因となる。

+0

これは、問題の誤植でした。気づいてくれてありがとう。私の構文は正しいです。 –

関連する問題