Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 插入时,可以输入主键';s值是否进入同一表上的另一个非空字段?_Sql Server - Fatal编程技术网

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