J'essaye de faire cette requête
INSERT INTO dbo.tbl_A_archive
SELECT *
FROM SERVER0031.DB.dbo.tbl_A
mais même après avoir couru
set identity_insert dbo.tbl_A_archive on
Je reçois ce message d'erreur
Une valeur explicite pour la colonne d'identité dans la table 'dbo.tbl_A_archive' ne peut être spécifiée que lorsqu'une liste de colonnes est utilisée et que IDENTITY_INSERT est activé.
tbl_A
est une table énorme en lignes et en largeur, c'est à dire qu'elle a BEAUCOUP de colonnes. Je ne veux pas avoir à taper toutes les colonnes manuellement. Comment puis-je faire fonctionner cela?
sql-server
jhowe
la source
la source
Réponses:
Résumé
SQL Server ne vous permet pas d'insérer une valeur explicite dans une colonne d'identité, sauf si vous utilisez une liste de colonnes. Ainsi, vous avez les options suivantes:
OU
tbl_A_archive
une colonne régulière, sans identité : Si votre table est une table d'archive et que vous spécifiez toujours une valeur explicite pour la colonne d'identité, pourquoi avez-vous même besoin d'une colonne d'identité? Utilisez simplement un int régulier à la place.Détails sur la solution 1
Au lieu de
tu dois écrire
avec
field1, field2, ...
contenant les noms de toutes les colonnes de vos tables. Si vous souhaitez générer automatiquement cette liste de colonnes, jetez un œil à la réponse de Dave ou à la réponse d' Andomar .Détails sur la solution 2
Malheureusement, il n'est pas possible de simplement "changer le type" d'une colonne identity int en une colonne non-identity int. Fondamentalement, vous avez les options suivantes:
OU
Identity Specification
/(Is Identity)
de la colonne d'identité dans votre table d'archivage surNo
. Dans les coulisses, cela créera un script pour recréer la table et copier les données existantes, donc, pour ce faire, vous devrez également désactiverTools
/Options
/Designers
/Table and Database Designers
/Prevent saving changes that require table re-creation
.OU
la source
Vous devez créer une liste de colonnes pour votre instruction INSERT:
pas comme "INSERT Into tableA SELECT ........"
la source
Si vous utilisez SQL Server Management Studio, vous n'avez pas besoin de taper vous-même la liste des colonnes - cliquez simplement avec le bouton droit sur la table dans l' Explorateur d'objets et choisissez Script Table as -> SELECT to -> New Query Editor Window .
Si ce n'est pas le cas, une requête similaire à celle-ci devrait vous aider comme point de départ:
la source
D'accord avec la réponse de Heinzi. Pour la première deuxième option, voici une requête qui génère une liste de colonnes séparées par des virgules dans une table:
Pour les grandes tables, cela peut économiser beaucoup de travail de frappe :)
la source
Si la table "archive" est censée être une copie exacte de votre table principale, je vous suggérerais simplement de supprimer le fait que l'id est une colonne d'identité. De cette façon, il vous permettra de les insérer.
Vous pouvez également autoriser et interdire les insertions d'identité pour la table avec l'instruction suivante
Enfin, si vous avez besoin que la colonne d'identité fonctionne telle quelle, vous pouvez toujours simplement exécuter le processus stocké.
Cela vous renverra toutes les colonnes de la table que vous pourrez ensuite couper et coller dans votre requête. (C'est presque TOUJOURS mieux que d'utiliser un *)
la source
Pour l'instruction SQL, vous devez également spécifier la liste des colonnes. Pour par exemple.
au lieu de
la source
Les deux fonctionneront mais si vous obtenez toujours une erreur en utilisant le # 1, passez au # 2
1)
2)
la source
Afin de remplir tous les noms de colonnes dans une liste délimitée par des virgules pour une instruction Select pour les solutions mentionnées pour cette question, j'utilise les options suivantes car elles sont un peu moins verbeuses que la plupart des réponses ici. Cependant, la plupart des réponses ici sont toujours parfaitement acceptables.
1)
2) Il s'agit probablement de l'approche la plus simple pour créer des colonnes, si vous disposez de SQL Server SSMS.
la source
Vous devez spécifier le nom des colonnes que vous souhaitez insérer s'il existe une colonne d'identité. Donc, la commande sera comme ceci ci-dessous:
Si votre table comporte de nombreuses colonnes, obtenez le nom de ces colonnes à l'aide de cette commande.
(après avoir supprimé la dernière virgule (',')) Copiez simplement le nom des colonnes.
la source
Cela devrait fonctionner. Je viens de rencontrer votre problème:
Malheureusement, il semble que vous ayez besoin d'une liste des colonnes comprenant la colonne d'identité pour insérer des enregistrements qui spécifient l'identité. Cependant , vous n'avez pas besoin de lister les colonnes dans le SELECT. Comme @ Dave Cluderay l'a suggéré, cela se traduira par une liste formatée que vous pourrez copier et coller (si moins de 200 000 caractères).
J'ai ajouté l'utilisation depuis que je passe d'une instance à l'autre.
la source
Pas comme ça
la source
Cet extrait de code montre comment insérer dans la table lorsque la colonne de clé primaire d'identité est activée.
la source
Pour si vous souhaitez insérer vos valeurs d'une table à une autre via une procédure stockée. J'ai utilisé ceci et cela , ce dernier qui ressemble presque à la réponse d'Andomar.
la source
Il existe une ou plusieurs colonnes qui ont une propriété d'incrémentation automatique ou la valeur de cet attribut sera calculée en tant que contraintes. Vous essayez de modifier cette colonne.
Il y a deux façons de le résoudre 1) Mentionnez explicitement les autres colonnes et définissez leurs valeurs uniquement et la clé primaire ou la valeur de la colonne à incrémentation automatique sera définie automatiquement.
2) Vous pouvez activer INDENTITY_INSERT puis exécuter votre requête d'insertion et enfin désactiver IDENTITY_INSERT.
Suggestion: Suivez la première étape car c'est une approche plus appropriée et plus efficace.
Pour plus d'informations, lisez cet article sur SQL-helper .
la source
Assurez-vous que les noms de colonne, les types de données et l'ordre dans la table à partir de laquelle vous sélectionnez les enregistrements sont exactement les mêmes que la table de destination. La seule différence doit être que la table de destination a une colonne d'identité comme première colonne, qui n'est pas là dans la table source.
J'étais confronté à un problème similaire lorsque j'exécutais "INSERT INTO table_Dest SELECT * FROM table_source_linked_server_excel". Les tableaux avaient 115 colonnes.
J'avais deux de ces tables où je chargeais des données d'Excel (en tant que serveur lié) dans des tables de la base de données. Dans les tables de base de données, j'avais ajouté une colonne d'identité appelée 'id' qui n'était pas là dans la source Excel. Pour une table, la requête s'exécutait avec succès et dans une autre, j'ai eu l'erreur "Une valeur explicite pour la colonne d'identité dans la table ne peut être spécifiée que lorsqu'une liste de colonnes est utilisée et IDENTITY_INSERT est SUR SQL Server". C'était déroutant car le scénario était exactement le même pour les deux requêtes. J'ai donc enquêté sur ceci et ce que j'ai trouvé était que dans la requête où j'obtenais une erreur avec INSERT INTO .. SELECT *:
Après avoir effectué les deux modifications ci-dessus, la requête INSERT INTO ... SELECT * s'est exécutée avec succès. La colonne d'identité dans la table de destination a généré des valeurs d'identité pour chaque ligne insérée comme prévu.
Ainsi, même si la table de destination peut avoir une colonne d'identité qui ne figure pas dans la table source, INSERT INTO .. SELECT * s'exécutera correctement si les noms, les types de données et l'ordre des colonnes dans la source et la destination sont exactement les mêmes.
J'espère que ça aide quelqu'un.
la source
Je pense que cette erreur se produit en raison de l'incompatibilité avec le nombre de colonnes dans la définition de table et le nombre de colonnes dans la requête d'insertion. La longueur de la colonne est également omise avec la valeur saisie. Consultez simplement la définition de la table pour résoudre ce problème
la source