Sur INSERT, la valeur de la key primaire peut-elle aller dans un autre champ non nul sur la même table?

Je suppose que la réponse est «non» parce que cela semble absurde, mais j'ai une situation rare où cela doit se produire:

Étant donné une table avec trois champs:

ID, PK, smallint, not null Code, Varchar(5), not null Name, VarChar(50), not null 

Puis-je magiquement insert le champ ID dans CODE avec une instruction INSERT?

 INSERT INTO MyTable (Code, Name) VALUES (CAST([ID's new Value] AS VARCHAR(5)),'New Name') 

REMARQUE: les modifications de la structure de la table (ou de la database) seraient excessives. Je veux accomplir en l'ajoutant à la fin d'une procédure stockée.

Si vous avez une identité et que ce n'est pas quelque chose que vous faites à chaque fois (quand un triggersur a le plus de sens), ce n'est pas très simple à faire. Fondamentalement, ce que vous faites est d'insert une fausse valeur dans le champ Code (parce que c'est nécessaire), puis de sortir la valeur d'identification de la table insérée, puis de mettre à jour la table avec l'ID. Bien sûr (comme pour toute action multi-états, vous devez utiliser les transactions try-catch et explicite, en annulant toutes les actions si une action échoue).

 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 

La façon dont vous accomplissez ceci est avec un triggersur de database: le triggersur se triggers à la suite de l'instruction d'insertion, donc il a la valeur insérée dans la table. Il peut ensuite faire une mise à jour.

Au less, c'est ce que vous pouvez faire dans Oracle. Je ne sais pas combien de contrôle un triggersur SQL-Server vous donne, ou quand un champ d'identité est donné une valeur, mais voici le doc: http://msdn.microsoft.com/en-us/library/ms189799.aspx

Vous pouvez envisager d'utiliser un triggersur AFTER INSERT pour copyr la valeur pour vous.

http://msdn.microsoft.com/en-us/library/aa258254(v=sql.80).aspx