我需要使用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
答案 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应被视为最后的手段。大卫布拉班特的答案似乎是解决原始问题的方法。