2012-03-19 123 views
0

我需要围绕下面的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 
+0

当我拿出GOs时,我得到一个有关modifiedDate的错误。你的意思是? “如果我拿出GOs,它会抱怨_modifiedDate_是无效的列。” – 2012-03-19 15:32:15

+0

TMP_FIELD是无效的列。 – Rod 2012-03-19 15:49:54

+0

我想我在测试时以不同的方式定义了表MY_TABLE。我没有在表格模式中包含列修改数据。我一开始并没有仔细阅读这个例子,所以我没有理解你正在使用的原始表的模式。 – 2012-03-19 15:55:56

回答

1

你真的不需要为改变列的类型而做所有的体操活动吗?

create table MY_TABLE (
    modifiedDate varchar(20) 
) 
go 

insert MY_TABLE (modifiedDate) values ('2012-10-20 17:50:41') 
go 

select * from MY_TABLE 
go 

alter table MY_TABLE alter column modifiedDate datetime 
go 

select * from MY_TABLE 
go 

drop table MY_TABLE 
go 

所以,我会写你的说法是这样的:

​​
0

的GOS标记一批TSQL语句的结束。在同一批次中,不能将DDL(数据定义语言)语句(如ALTER TABLE)与DML(数据操作语言)语句(如UPDATE TABLE)混合使用。

每批都是自己编译的。因此,当ALTER TABLE和UPDATE TABLE语句在同一批次中时,SQL Server无法编译更新语句,因为列modifiedData尚未实际创建。

+0

那么你如何在一组批次中添加条件? – Rod 2012-03-19 16:32:42

0

如果你想解决'Invalid column ..'错误,一个选择是使用动态SQL。 例如:

create table dbo.t1 (id int primary key, cola varchar(20)) 
go 

insert dbo.t1 values (1, 'one') 
insert dbo.t1 values (2, 'two') 
go 

if not exists(select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 't1' and COLUMN_NAME = 'colb') 
BEGIN 
    -- add new column 'colb', and set its value initially to existing values in 'cola' 
    ALTER TABLE dbo.t1 ADD colb varchar(20) 

    DECLARE @v NVARCHAR(500) 
    SET @v = N'UPDATE dbo.t1 SET colb = cola' 
    EXEC (@v) -- use dynamic SQL, otherwise will get Invalid column name colb error.  
END 
GO 

请注意,动态SQL应被视为最后的手段。大卫布拉班特的答案似乎是解决原始问题的方法。