Sql server sql脚本、if和go语句
我需要在下面的sql脚本中使用if语句来检查一个表的存在性。语句中还有更多的字段,但下面的代码片段应该足以说明问题 如果我用一个If语句来包围整个批,它就不喜欢在If语句之间有GOs。如果我取出GOs,它会抱怨TMP_字段是无效列 有哪些正确的方法可以做到这一点?我所做的就是获取一组字段,并从varchar更改为datetime。这是setup.exe文件的一部分,所以我只需要它运行一次,而不是用于将来的升级。我确定的方法是,如果某个表存在,则不运行脚本Sql server sql脚本、if和go语句,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我需要在下面的sql脚本中使用if语句来检查一个表的存在性。语句中还有更多的字段,但下面的代码片段应该足以说明问题 如果我用一个If语句来包围整个批,它就不喜欢在If语句之间有GOs。如果我取出GOs,它会抱怨TMP_字段是无效列 有哪些正确的方法可以做到这一点?我所做的就是获取一组字段,并从varchar更改为datetime。这是setup.exe文件的一部分,所以我只需要它运行一次,而不是用于将来的升级。我确定的方法是,如果某个表存在,则不运行脚本 IF EXISTS (SELECT *
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
你真的不需要做所有的体操来改变一个专栏的类型,是吗
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
GOs标志着一批TSQL语句的结束。不能将ALTER TABLE等DDL(数据定义语言)语句与UPDATE TABLE等DML(数据操作语言)语句混合在同一批中
每个批都是自己编译的。因此,当ALTER TABLE和UPDATE TABLE语句在同一批中时,SQL Server无法编译UPDATE语句,因为实际上尚未创建列modifiedData。如果要避免“Invalid column..”错误,一个选项是使用动态SQL。 e、 g:
注意,动态SQL应该被视为最后的手段。David Brabant的答案似乎是解决原始问题的方法。当我取出GOs时,我得到一个关于modifiedDate的错误。你是说?“如果我去掉GOs,它会抱怨modifiedDate是一个无效列。”我想我在测试时对表MY_表的定义不同。我没有在表架构中包含modifiedData列。一开始我没有仔细阅读这个示例,所以我没有仔细研究您正在使用的原始表的模式。那么如何在批处理组周围设置条件呢?
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