假设我有一个表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.
答案 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
声明是不可避免的。