我有一个包含现有数据的表成员,我想添加一个名为' 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阻止我访问两者之间的标量变量。
这似乎是一个相当常见的用例,所以我假设我只是缺少一些东西,任何帮助都会非常感激
答案 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后,您无法使用之前声明的变量。