Comment obtenir des valeurs d'incrémentation automatique après l'insertion d'enregistrements à l'aide de SqlBulkCopy via c #

c# sql sqlbulkcopy stored-procedures

Question

J'utilise la classe SqlBulkCopy pour insérer des enregistrements en bloc, mais je veux que auto-increment valeurs d' auto-increment nouvellement générées (la clé primaire joue de la clé étrangère dans la table enfant) car, avec l'aide de cette valeur, je vais jouer avec les tables enfant (clé étrangère) faisant insérer .

Veuillez suivre l'exemple ci-dessous pour obtenir une image claire,

Table source: Créer une table StagingTable (personName varchar (50)) à insérer dans les valeurs StaginTable ('Test1') .. .. .. à insérer dans les valeurs StaginTable ('Test10,000')

Table cible: Créer une table TargetTable (personId int identity (1,1), personName varchar (50)) à insérer dans les valeurs TargetTable ('Déjà1') .. .. à insérer dans les valeurs TargetTable ('Déjà10')

Maintenant, j'ai 10 enregistrements dans TargetTable avec 10 enregistrements avec personId (1 à 10), donc ma question est d'insérer 10 000 enregistrements de StagingTable dans TargetTable et de le rendre comme 10 010 enregistrements entre-temps, je n'ai besoin que de 10 000 valeurs d'identité uniques en excluant 10 valeurs d'identité avec l'aide du concept de fusion dans le serveur SQL 2012.

Créer la procédure Merge_GetNewIdentityValues ​​As MERGE TargetTable AS T USING StagingTable AS S ON 1! = 1 lorsqu'il ne correspond pas, insérez des valeurs (personName) (S.StagingTable) output Insert.personId; - Obtenir les valeurs du champ d'identité [nouvellement inséré]

Comment cela peut-il être géré en simultanéité? Que le mot clé "inséré" soit lu dans un contexte séparé ou dans un contexte unique utilisé par différents utilisateurs pour appeler la même procédure stockée

Merci, S.Venkatesh

Réponse acceptée

Pour que la table de destination attribue l'identité, n'utilisez pas l'option SqlBulkCopyOptions.KeepIdentity . Au lieu de cela, ne SqlBulkCopy pas l'identité de la source et ne l'extrayez pas de la source pour l'envoyer à SqlBulkCopy .


Réponse populaire

Remplissez le ColumnMapping de l'objet BulkCopy sans mapper la colonne d'identité. La colonne d'identité sera générée par la base de données cible.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi