如何编写更新以添加具有现有值的列

时间:2017-08-16 18:11:55

标签: sql sql-server

我有一个包含现有数据的表成员,我想添加一个名为' IsOnlineUser'的非可空位列,我希望所有现有行都设置为false。我有一组脚本,每次部署时运行,所以我需要检查表是否

我试过的第一个SQL是

SET @ColumnExists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS 

WHERE TABLE_NAME = 'Member' AND COLUMN_NAME = 'IsOnlineUser');

IF (@ColumnExists = 0)
BEGIN
    ALTER TABLE Member ADD IsOnlineUser bit NULL;

    UPDATE Member SET IsOnlineUser= 0;
    ALTER TABLE Member ALTER COLUMN IsOnlineUser bit NOT NULL;
END
GO

但那给了我

  

列名称无效' IsOnlineUser'

。假设这是因为UPDATE无法找到创建的列,所以我想如果我放了一个' GO'在这两个陈述之间它会有所帮助,所以我做了以下几点:

SET @ColumnExists = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS 

WHERE TABLE_NAME = 'Member' AND COLUMN_NAME = 'IsOnlineUser');

IF (@ColumnExists = 0)
BEGIN
    ALTER TABLE Member ADD IsOnlineUser bit NULL;

END
GO 

IF (@ColumnExists = 0)
BEGIN
    UPDATE Member SET IsOnlineUser= 0;
    ALTER TABLE Member ALTER COLUMN IsOnlineUser bit NOT NULL;
END
GO

然而,这说

  

必须声明标量变量" @ ColumnExists"。

假设这是因为GO阻止我访问两者之间的标量变量。

这似乎是一个相当常见的用例,所以我假设我只是缺少一些东西,任何帮助都会非常感激

2 个答案:

答案 0 :(得分:2)

您可以使用默认约束将列添加为alter table Member add IsOnlineUser bit not null default 0;

alter table member 
  add IsOnlineUser bit not null 
    constraint df_Member_IsOnlineUser default 0;

或者,您可以同时为约束指定特定名称,如下所示:

if

为了简化not exists(),您可以跳过变量并使用if not exists ( select 1 from information_schema.columns where table_name = 'Member' and column_name = 'IsOnlineUser' ) begin; alter table member add IsOnlineUser bit not null constraint df_Member_IsOnlineUser default 0; end; ,如下所示:

exec

如果您只想在保持当前逻辑的同时使现有代码工作,则可以使用... if (@ColumnExists = 0) begin; exec sp_executesql N'alter table Member add IsOnlineUser bit null'; exec sp_executesql N'update Member set IsOnlineUser= 0;'; exec sp_executesql N'alter table Member alter column IsOnlineUser bit not null;'; end; go sp_executesql执行sql字符串而不是内联代码。

import pandas as pd
import numpy as np

df = pd.DataFrame([{'city':"Berlin", 'lat':52.5243700, 'lng':13.4105300},
                   {'city':"Potsdam", 'lat':52.3988600, 'lng':13.0656600},
                   {'city':"Hamburg", 'lat':53.5753200, 'lng':10.0153400}]);
df

答案 1 :(得分:0)

您可以检查列是否不存在,并在需要时添加。放GO后再去更新和更改。它可以在任何列存在或不存在的情况下正确运行。不需要变量。

IF NOT EXISTS (SELECT * FROM sys.columns WHERE name = 'IsOnlineUser' AND object_id = OBJECT_ID('Member'))
ALTER TABLE Member ADD IsOnlineUser bit NULL;
GO
UPDATE Member SET IsOnlineUser= 0;
ALTER TABLE Member ALTER COLUMN IsOnlineUser bit NOT NULL;
GO

注意:我更喜欢使用SQL Server的sys视图而不是ANSI INFORMATION.SCHEMA,并希望显示替代方案,但这只是我。如果您愿意,可以保留INFORMATION.SCHEMA。

编辑-PS:变量仅存在于一个批次中。使用GO后,您无法使用之前声明的变量。