Sql 通过添加其值依赖于另一列的新列来更改表

Sql 通过添加其值依赖于另一列的新列来更改表,sql,sql-server,Sql,Sql Server,我有一张桌子 初期 中期 到目前为止,我所拥有的: ALTER TABLE SMTP ADD ConnectionType INT NOT NULL MIDDLE STAGE.... HAPPENS HERE ALTER TABLE SMTP DROP COLUMN ConnectionRequired 你在找中间阶段吗?如果是的话,我会试试看 更新smtp集connectionType=decodeconnectionRequired'1',1,0 你在寻找中间阶段吗?如果是的话,

我有一张桌子

初期

中期

到目前为止,我所拥有的:

ALTER TABLE SMTP ADD ConnectionType INT NOT NULL

   MIDDLE STAGE.... HAPPENS HERE

ALTER TABLE SMTP DROP COLUMN ConnectionRequired

你在找中间阶段吗?如果是的话,我会试试看


更新smtp集connectionType=decodeconnectionRequired'1',1,0

你在寻找中间阶段吗?如果是的话,我会试试看


更新smtp集connectionType=decodeconnectionRequired'1',1,0

并在Sql server和Oracle上工作

update smtp set connectionType = (case when connectionRequired = '1' then 1 else 0 end);

以及在Sql server和Oracle上工作

update smtp set connectionType = (case when connectionRequired = '1' then 1 else 0 end);
如果表包含数据,则不能对新列使用not null。您必须先创建它以允许null,然后运行中间阶段,然后更改notnull约束。但这将失败,因为ConnectionRequired中存在空值。你想如何处理这些问题

对于中间阶段:使用

update SMTP set ConnectionType = cast(ConnectionType as int)
这会将“1”字符转换为1 int,“0”字符转换为0 int,将NULL字符转换为NULL int。

如果表包含数据,则不能在新列上使用not NULL。您必须先创建它以允许null,然后运行中间阶段,然后更改notnull约束。但这将失败,因为ConnectionRequired中存在空值。你想如何处理这些问题

对于中间阶段:使用

update SMTP set ConnectionType = cast(ConnectionType as int)

这将把“1”字符转换为1 int,“0”字符转换为0 int,空字符转换为空int。

用以下语句添加一个新列

ALTER TABLE Table_Name
ADD ConnectionType INT 
UPDATE Table_Name
SET ConnectionType  = CASE WHEN ConnectionRequired = '1' 
                       THEN 1 ELSE 0 END
使用以下语句更新列

ALTER TABLE Table_Name
ADD ConnectionType INT 
UPDATE Table_Name
SET ConnectionType  = CASE WHEN ConnectionRequired = '1' 
                       THEN 1 ELSE 0 END

使用以下语句添加一个新列

ALTER TABLE Table_Name
ADD ConnectionType INT 
UPDATE Table_Name
SET ConnectionType  = CASE WHEN ConnectionRequired = '1' 
                       THEN 1 ELSE 0 END
使用以下语句更新列

ALTER TABLE Table_Name
ADD ConnectionType INT 
UPDATE Table_Name
SET ConnectionType  = CASE WHEN ConnectionRequired = '1' 
                       THEN 1 ELSE 0 END

添加一个列只是为了用数据更新它似乎需要更多的步骤。我不确定这是否会导致更少的日志,但它似乎不太可能导致页面拆分,并至少暂时扩展表的大小

鉴于:

CREATE TABLE dbo.SMTP
(
  Id INT PRIMARY KEY,
  [Server] NVARCHAR(256),
  ConnectionRequired CHAR(1)
);

INSERT dbo.SMTP VALUES
(0,'smtp.tea.com   ','1' ),
(1,'smtp.juice.com ','0' ),
(2,'smtp.coffee.com',NULL),
(3,'smtp.milk.org  ','1' );
然后,您只需首先更新数据以消除空值:

还要决定对数据不是“0”或“1”的任何行执行什么操作:

然后更改数据类型和可空性:

ALTER TABLE dbo.SMTP ALTER COLUMN ConnectionRequired INT NOT NULL;
并重命名该列:

EXEC sp_rename N'dbo.SMTP.ConnectionRequired', N'ConnectionType', N'COLUMN';

添加一个列只是为了用数据更新它似乎需要更多的步骤。我不确定这是否会导致更少的日志,但它似乎不太可能导致页面拆分,并至少暂时扩展表的大小

鉴于:

CREATE TABLE dbo.SMTP
(
  Id INT PRIMARY KEY,
  [Server] NVARCHAR(256),
  ConnectionRequired CHAR(1)
);

INSERT dbo.SMTP VALUES
(0,'smtp.tea.com   ','1' ),
(1,'smtp.juice.com ','0' ),
(2,'smtp.coffee.com',NULL),
(3,'smtp.milk.org  ','1' );
然后,您只需首先更新数据以消除空值:

还要决定对数据不是“0”或“1”的任何行执行什么操作:

然后更改数据类型和可空性:

ALTER TABLE dbo.SMTP ALTER COLUMN ConnectionRequired INT NOT NULL;
并重命名该列:

EXEC sp_rename N'dbo.SMTP.ConnectionRequired', N'ConnectionType', N'COLUMN';

因此,您只需要计算一段时间,但在计算后删除源列?您使用的是SQL Server还是Oracle?您可能需要发布两个不同的问题,因为答案几乎肯定会不同。如果有人发布SQL Server答案,而其他人发布Oracle答案,您将如何选择答案?@AaronBertrand Good point。。。然后才修改为SQL Server。因此,您只需要计算一段时间,但在计算后删除源列?您使用的是SQL Server还是Oracle?您可能需要发布两个不同的问题,因为答案几乎肯定会不同。如果有人发布SQL Server答案,而其他人发布Oracle答案,您将如何选择答案?@AaronBertrand Good point。。。只有在那时才修改到SQL Server。@gtgaxiola那么,出于好奇,如果在ALTER TABLE SMTP ADD ConnectionType INT NOT NULL之后执行此操作,那么这怎么可能起作用呢?这不可能像Msg 4901那样工作。@gtgaxiola那么,出于好奇,如果您在ALTER TABLE SMTP ADD ConnectionType INT NOT NULL之后这样做,这怎么可能工作呢?这不可能像味精4901那样起作用。