sql脚本,if和go语句

时间:2012-03-19 15:00:58

标签: sql-server sql-server-2008 tsql

我需要使用if语句来包围以下sql脚本,以检查是否存在一个表。该声明还有很多字段,但下面的代码段应该足以让我们了解它。

如果我用if语句包围整个批次,那么我不喜欢在if语句之间进行操作。如果我拿出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

3 个答案:

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

所以,我会写这样的陈述:

if exists (select table_name from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'MY_TABLE')
begin
  alter table MY_TABLE alter column modifiedDate datetime
end

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果你想绕过'无效列..'错误,一个选项就是使用动态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应被视为最后的手段。大卫布拉班特的答案似乎是解决原始问题的方法。