正在为可能可能多次运行的旧数据库准备更新脚本。
如果它多次运行,某些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
答案 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;
这将防止编译错误,因为该列不存在。