J'ai une table. Le tableau doit stocker des valeurs de nombre d'un endroit, donc d'abord j'avais juste les deux colonnes sans la colonne incrémenter, donnant les éléments suivants:TSQL Insert Conundrum
RefID | TypeID
1 | 1
1 | 3
1 | 6
2 | 3
3 | 5
3 | 6
Lorsque la première colonne est la référence pour un emplacement et le second est les valeurs réelles.
Le problème était de savoir comment choisir la valeur à donner à la première colonne. L'idée que j'ai est d'ajouter un champ d'auto-incrémentée pour générer ces valeurs, donc je devrais les données suivantes à la place:
ID | RefID | TypeID
1 | 1 | 1
2 | 1 | 3
3 | 1 | 6
4 | 4 | 3
5 | 5 | 5
6 | 5 | 6
Ainsi, la colonne NuméroAuto (colonne 1) agit comme une graine pour la colonne de référence. J'ai donc deux problèmes: copier la valeur de la colonne d'identité dans la colonne de référence et renvoyer la valeur de référence à l'application afin qu'elle puisse être utilisée s'il y a plus d'une valeur pour l'emplacement.
je suis venu avec cette procédure stockée:
CREATE PROCEDURE [dbo].[AddCaseType]
(
@TypeID INTEGER,
@CaseID INTEGER = NULL OUT
)
AS
BEGIN
INSERT INTO
dbo.CaseTypeList(RefID, TypeID)
VALUES
(ISNULL(@CaseID,SCOPE_IDENTITY()), @TypeID)
Set @CaseID = SCOPE_IDENTITY()
END
GO
vérifie isNull pour NULL sur CaseID et si elle est nulle à utiliser la valeur SCOPE_IDENTITY()
. Howevert SCOPE_IDENTITY
est évalué avant l'insertion et retourne ainsi la dernière identité générée et non la nouvelle.
Je ne peux pas utiliser une valeur unique d'une table liée car j'ai besoin d'un suivi complet si un utilisateur édite les valeurs. Donc je sais ce que je veux faire, mais je n'ai pas les connaissances ou l'expérience pour le faire. Donc pour encapsuler: Comment puis-je générer une valeur unique pour le premier élément d'un ensemble et renvoyer cette valeur afin que je puisse le réutiliser pour le reste de cet ensemble?
Aussi, vous pourriez répondre s'il existe un autre moyen, plus simple. S'il vous plaît rappelez-vous - je suis un débutant en matière de SQL, donc je dois comprendre pourquoi quelque chose se passe parce que je pourrais avoir besoin de le changer à l'avenir. Après avoir pris un café, j'ai remarqué une erreur dans mon code - un résultat de la modification à trois colonnes, donc [ID] devient RefID dans la première partie de l'instruction INSERT. Cela invalide également une partie du code et modifie donc en partie la nature de mon problème. Désolé pour la confusion que cela peut causer.
@Graham: Pouvez-vous ajouter des en-têtes de colonne sur vos tables d'échantillons? –
@Michael Haren. Terminé. J'ai aussi remarqué un bug dans mon code qui invalide une partie de mon problème. –
@Graham: J'ai mis à jour ma réponse pour capturer, je l'espère, vos changements. Note sur @@ Identity ou Scope_Identity(): il récupère une valeur qui a été * insérée le plus récemment * dans la portée désirée - pas la valeur * next *. C'est pourquoi dans ma réponse, je génère moi-même le numéro dans une transaction. –