如何添加非空列,从另一列复制数据

时间:2014-07-02 19:18:28

标签: sql-server tsql sql-server-2012

假设我有一个表A如下:

dbo.A
____________
ID (PK, int, not null)
RequestID (FK, int, not null)
AssignedUserID (FK, nvarchar(128), not null)

由于流程的变化,我们添加了一个列'IssuedUserID'并删除了AssignedUserID上的'not null'约束。此表跟踪由用户发布然后由用户分配的内容,并且由于进程中的更改,这些不再需要是同一用户。

因此,对于现有行,IssuedUserID将匹配AssignedUserID。继续前进,AssignedUserId将为null,直到分配行为止。

我知道我可以编写一个脚本,将IssuedUserID作为可空字段添加,更新它以匹配AssignedUserId,然后将其更改为非null,但我想将其作为列创建的一部分来执行实用。

是否有基于另一列数据填充行的新列数据的语法?

如果重要的话,我们正在使用MS SQL Server 2012.

2 个答案:

答案 0 :(得分:0)

您可以使用COMPUTED列。很少摘自MSDN规范

  

计算列是未物理存储的虚拟列   该表,除非该列标记为PERSISTED。计算列   表达式可以使用其他列中的数据来计算值   它所属的列。您可以为a指定表达式   计算列

一个例子如下所示。因此,在这种情况下,COMPUTED_ID将比ID的值多一个。

CREATE TABLE table1(ID INT NOT NULL IDENTITY PRIMARY KEY,
NAME VARCHAR(10), COMPUTED_ID AS ID+1 PERSISTED)

在您的情况下,您可以执行类似

的操作
dbo.A
____________
ID (PK, int, not null)
RequestID (FK, int, not null)
AssignedUserID (FK, nvarchar(128), not null)
IssuedUserID AS ISNULL(AssignedUserID,'0') PERSISTED

有关相同内容的详情,请参阅Here

修改

在这种情况下,唯一的方法是你最初想要尝试的方式,而不是UPDATE单行,你可以采取更快的方法,如

创建另一个类似的表

CREATE TABLE NEW_A
(
    ID (PK, int, not null)
    RequestID (FK, int, not null)
    AssignedUserID (FK, nvarchar(128), not null)
    IssuedUserID (nvarchar(128), not null)
)

执行INSERT INTO SELECT之类的

INSERT INTO NEW_A 
SELECT RequestID,
AssignedUserID,
ISNULL(AssignedUserID,'0') AS IssuedUserID
FROM A

DROP现有表A

DROP TABLE A

RENAME新表格A

sp_rename NEW_A, A

答案 1 :(得分:0)

您希望使现有列可为空,并添加新的非可空列。以相反的方式工作更容易(也更快);添加一个可为空的列,然后重命名列。

ALTER TABLE dbo.A ADD NewUserID nvarchar(128) NULL
UPDATE dbo.A SET NewUserID = AssignedUserID
EXEC sp_rename 'dbo.A.AssignedUserID', 'IssuedUserID', 'COLUMN'
EXEC sp_rename 'dbo.A.NewUserID', 'AssignedUserID', 'COLUMN'

如有必要,在AssignedUserID上添加索引; AssignedUserID上的任何现有索引都已自动转到IssuedUserID。

据我所知,UPDATE声明是不可避免的。