2

再実行可能なスクリプトを作成しようとしています

IF EXISTS ((SELECT * from information_schema.columns where TABLE_SCHEMA=N'MySchema' and TABLE_NAME=N'Table1' AND COLUMN_NAME=N'Column1'))
BEGIN
   PRINT 'Updating'

   UPDATE [Table2] 
   SET Column = 0
   WHERE Id IN (SELECT t2.Id 
                FROM [Table2] t2 
                JOIN [MySchema].[Table1] t1 ON t2.UserId = t1.UserId 
                WHERE t1.Column1 = 0)

   ALTER TABLE [MySchema].[Table1] DROP COLUMN Column1
END

1回目は動作するが、2回目はエラーになる

列名 'Column1' が無効です。

どんな助けでも大歓迎です。sys.columns列が存在するかどうかを確認するために以前に使用していました。SQL Server 2005 用です。

4

2 に答える 2

2

T-SQL はバッチ スクリプトではなく、パーサーは実行前にステートメント全体をチェックします。したがって、副選択の列が存在しない場合、チェックは実行が開始される前に失敗します。

EXECUTEコードを機能させるには、UPDATE ステートメントと ALTER ステートメントを文字列としてorに渡す必要がありますEXEC sp_executesql

Q2586737も参照してください

于 2013-02-21T22:08:32.673 に答える
1

スクリプトをバッチに分割することに問題がない場合は、SET NOEXECコマンドを使用できます。

列が存在しない場合はONに設定してください。UPDATEとALTERTABLEを別々のバッチに入れます。つまり、条件から。で区切りGOます。別のものを入れて、条件に依存しない、実行する必要のある他のステートメントがスクリプトにある場合はGO追加します。SET NOEXEC OFF

説明のために、これは私が意味するものです:

IF NOT EXISTS (
  SELECT *
  from information_schema.columns
  where TABLE_SCHEMA=N'MySchema'
    and TABLE_NAME=N'Table1'
    AND COLUMN_NAME=N'Column1'
)
  SET NOEXEC ON
GO

PRINT 'Updating'

UPDATE [Table2] 
SET Column = 0
WHERE Id IN (SELECT t2.Id 
             FROM [Table2] t2 
             JOIN [MySchema].[Table1] t1 ON t2.UserId = t1.UserId 
             WHERE t1.Column1 = 0)

ALTER TABLE [MySchema].[Table1] DROP COLUMN Column1
GO
SET NOEXEC OFF
... -- the rest of the script, if any
于 2013-02-21T22:43:54.563 に答える