我需要围绕下面的SQL脚本与if语句检查一个表的存在。声明中有很多字段,但下面的代码片段应该足以实现这个想法。SQL脚本,如果和去声明
如果我用if语句包围整个批处理,它不会像我在if语句之间有GO。如果我拿出GO,它会抱怨TMP_FIELD是一个无效的列。
有什么方法可以正确地做到这一点?我正在做的是采取一堆字段,并从varchar更改为datetime。这是setup.exe文件的一部分,所以我只需要它运行一次,而不是将来的升级。我确定的方式是,如果某个表存在,则不要运行该脚本。
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
ALTER TABLE MY_TABLE ADD TMP_FIELD datetime
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
UPDATE MY_TABLE SET TMP_FIELD = modifiedDate
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
ALTER TABLE MY_TABLE DROP COLUMN modifiedDate
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
ALTER TABLE MY_TABLE ADD modifiedDate datetime
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
UPDATE MY_TABLE SET modifiedDate = TMP_FIELD
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
ALTER TABLE MY_TABLE DROP COLUMN TMP_FIELD
GO
当我拿出GOs时,我得到一个有关modifiedDate的错误。你的意思是? “如果我拿出GOs,它会抱怨_modifiedDate_是无效的列。” – 2012-03-19 15:32:15
TMP_FIELD是无效的列。 – Rod 2012-03-19 15:49:54
我想我在测试时以不同的方式定义了表MY_TABLE。我没有在表格模式中包含列修改数据。我一开始并没有仔细阅读这个例子,所以我没有理解你正在使用的原始表的模式。 – 2012-03-19 15:55:56