T-SQL, Insérer dans avec MAX () + 1 dans la sous-requête n'incrémente pas, les alternatives?
J'ai une question où j'ai besoin de "lot" insérer des lignes dans une table avec une clé primaire sans identité.
--TableA
--PK int (Primary key, no-identity)
--CustNo int
INSERT INTO TableA (PK,CustNo)
SELECT (SELECT MAX(PK)+1 AS PK FROM TableA), CustNo
FROM Customers
(exemple simplifié - merci de ne pas commenter sur d'éventuels problèmes de concurrence :-))
Le problème est qu'il n'a pas d'incrémenter le PK "pour chaque" traitées ligne, et je reçois une violation de clé primaire.
Je sais comment le faire avec un curseur/la boucle while, mais je voudrais l'éviter, et de le résoudre dans un ensemble à base de genre de manière, si c'est encore possible ?
(exécutant SQL Server 2008 Standard)
source d'informationauteur KorsG
Vous devez vous connecter pour publier un commentaire.
+1 à Michael Buen, mais j'ai une suggestion:
La table "tablea" peut être vide, donc nous devrions écrire:
Cela permettra d'éviter une erreur nulle lors de l'utilisation de ce code.
Le problème comme vous l'avez vu, c'est qu'ils ont tous le même numéro de ligne, le max(PK) +1 est le même pour chaque ligne.
Essayer de le convertir à
Max(PK) + Row_number()
Je suis en train de travailler sur la base de pourquoi vous savez que c'est une mauvaise idée, etc, et votre question est simplifié dans le but d'obtenir une réponse, et pas de la façon dont vous le souhaitez pour résoudre le problème.
Vous le pouvez;
J'ai une suggestion pour vous copain, une meilleure pratique sur SQL dit d'utiliser de la SÉQUENCE, et devinez quoi, il est TRÈS facile à faire à l'homme, il suffit de copier et de coller le mien:
et de l'utiliser comme ceci:
Espère que cette astuce en mesure d'aider ya!