2017-05-20 19 views
0

複数回実行される可能性のある古いデータベースの更新スクリプトを準備中です。条件付きで更新クエリを実行します。

複数回実行すると、列などの一部のdbオブジェクトが消滅している可能性があります。そのため、特定の条件によっては実行されないスクリプトがいくつかあります。

たとえば、次のとおりです。 evtype列がまだ利用可能な場合にのみ更新を実行したい。しかし、これを2回目の実行で含めると、無効な列のevtypeが発生します。

は、どのように私はあなたが列を削除する場合は、貧しい人々のデザインを持っている

PRINT 'Update event type IDs' 
--IF COL_LENGTH('events', 'evtype') IS NOT NULL 
IF EXISTS(SELECT 1 FROM sys.columns 
      WHERE Name = N'evtype' 
      AND Object_ID = Object_ID(N'events')) 
BEGIN 
    UPDATE [events] 
    SET evtypeid=1 WHERE evtype='d' 
    UPDATE [events] 
    SET evtypeid=2 WHERE evtype='w' 
    UPDATE [events] 
    SET evtypeid=3 WHERE evtype='s' 
END 

PRINT 'Dropping events.evtype column' 
IF COL_LENGTH('events', 'evtype') IS NOT NULL 
BEGIN 
    ALTER TABLE events 
    DROP COLUMN evtype 
END 

答えて

1

この問題を回避することができます。しかし、あなたの問題を解決するには、動的SQLを使用してください:

IF EXISTS (SELECT 1 FROM sys.columns 
      WHERE Name = N'evtype' AND Object_ID = Object_ID(N'events') 
     ) 
BEGIN 
    DECLARE @sql NVARCHAR(MAX); 
    SET @sql = ' 
UPDATE events 
    SET evtype = (CASE WHEN evtype = ''d'' THEN 1 
         WHEN evtype = ''w'' THEN 2 
         WHEN evtype = ''s'' THEN 3 
        END) 
    WHERE evtypeid IN (''d'', ''w'', ''s'') 
'; 

    exec sp_executesql @sql 
END; 

これは、列が存在しないため、コンパイルエラーを防止します。

+2

一重引用符を二重にしてエスケープする必要があります。 –

+0

非常によく設計されていないデータベースです。私たちはリファクタリングしています。 – wingyip