Sql server 插入时,可以输入主键';s值是否进入同一表上的另一个非空字段?
我猜答案是“不”,因为这看起来很荒谬,但我有一个罕见的情况需要这样做: 给定一个包含三个字段的表:Sql server 插入时,可以输入主键';s值是否进入同一表上的另一个非空字段?,sql-server,Sql Server,我猜答案是“不”,因为这看起来很荒谬,但我有一个罕见的情况需要这样做: 给定一个包含三个字段的表: ID, PK, smallint, not null Code, Varchar(5), not null Name, VarChar(50), not null 我能用insert语句神奇地将ID字段插入代码吗 INSERT INTO MyTable (Code, Name) VALUES (CAST([ID's new Value] AS VARCHAR(5)),'New Name'
ID, PK, smallint, not null
Code, Varchar(5), not null
Name, VarChar(50), not null
我能用insert语句神奇地将ID字段插入代码吗
INSERT INTO MyTable (Code, Name)
VALUES (CAST([ID's new Value] AS VARCHAR(5)),'New Name')
注意:对表结构(或数据库)的更改可能会有点过头。我想通过在存储过程的末尾附加它来完成 > P>您可以考虑使用后置触发器为您复制值。
实现这一点的方法是使用数据库触发器:触发器作为insert语句的结果激发,因此它将值插入表中。然后它可以进行更新
至少,这是你在甲骨文中可以做到的。我不知道SQL Server触发器给了您多少控制权,也不知道何时给标识字段一个值,但这里有一个文档:如果您有一个标识,并且不是每次都这样做(当触发器最有意义时),这不是很容易做到的。基本上,您要做的是在代码字段中插入一个假值(因为它是必需的),然后输出插入表的id值,然后用id更新表。当然(与任何多状态操作一样,您应该使用try-catch和显式事务,如果任何一个操作失败,则回滚所有操作)
@HLGEM是的,ID是一个标识。在保存之后我才知道它的价值。而且,“需要”有点强。假设这是这个用例的“首选”场景。您的
ID
字段是notnull
,这意味着它不能null
。code
的值是否可以更新为与ID
不同?如果没有,您可以用计算列替换现有列。
DECLARE @output TABLE (Id INT))
INSERT INTO MyTable (Code, Name)
OUTPUT Inserted.ID INTO @output
VALUES ('test','New Name')
UPDATE m
SET code = o.Id
FROM Mytable m
JOIN @output o ON m.Id = o.id