有条件地执行更新查询

时间:2017-05-20 14:24:02

标签: sql-server tsql

正在为可能可能多次运行的旧数据库准备更新脚本。

如果它多次运行,某些db对象(如列)可能已经消失,因此会有一些脚本根据特定条件不能运行。

例如以下内容。如果evtype列仍然可用,我只想运行更新。但是,在第二次运行中包含此内容会出现无效的列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 个答案:

答案 0 :(得分: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;

这将防止编译错误,因为该列不存在。