Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server sql脚本、if和go语句_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql server sql脚本、if和go语句

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 *

我需要在下面的sql脚本中使用if语句来检查一个表的存在性。语句中还有更多的字段,但下面的代码片段应该足以说明问题

如果我用一个If语句来包围整个批,它就不喜欢在If语句之间有GOs。如果我取出GOs,它会抱怨TMP_字段是无效列

有哪些正确的方法可以做到这一点?我所做的就是获取一组字段,并从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

你真的不需要做所有的体操来改变一个专栏的类型,是吗

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