Cette question se rapproche de ce dont j'ai besoin, mais mon scénario est légèrement différent. La table source et la table de destination sont identiques et la clé primaire est un uniqueidentifier (guid). Quand j'essaye ceci:
insert into MyTable
select * from MyTable where uniqueId = @Id;
J'obtiens évidemment une violation de contrainte de clé primaire, car j'essaie de copier la clé primaire. En fait, je ne veux pas du tout copier la clé primaire. Je veux plutôt en créer un nouveau. De plus, je voudrais copier sélectivement certains champs et laisser les autres nuls. Pour rendre les choses plus complexes, je dois prendre la clé primaire de l'enregistrement d'origine et l'insérer dans un autre champ de la copie (champ PreviousId).
Je suis sûr qu'il existe une solution simple à cela, je ne connais tout simplement pas assez TSQL pour savoir ce que c'est.
la source
Ok, je sais que c'est un vieux problème mais je poste quand même ma réponse.
J'aime cette solution. Je n'ai qu'à spécifier la (les) colonne (s) d'identité.
La colonne "id" est la colonne d'identité et c'est la seule colonne que je dois spécifier. C'est mieux que l'inverse de toute façon. :-)
J'utilise SQL Server. Vous pouvez utiliser "
CREATE TABLE
" et "UPDATE TABLE
" aux rangées 1 et 2. Hmm, j'ai vu que je n'ai pas vraiment donné la réponse qu'il voulait. Il voulait également copier l'identifiant dans une autre colonne. Mais cette solution est intéressante pour faire une copie avec un nouvel identifiant automatique.J'édite ma solution avec les idéas de Michael Dibbets.
Vous pouvez supprimer plusieurs colonnes en les séparant par un ",". Le: id doit être remplacé par l'id de la ligne que vous souhaitez copier. MyDatabase, MyTable et IndexField doivent être remplacés par vos noms (bien sûr).
la source
TempTable
, ne serait-il pas préférable d'utiliser#TempTable
, donc c'est une vraie table temporaire?use MyDatabase; SELECT * INTO #TempTable FROM [TABLE] WHERE [indexfield] = :id; ALTER TABLE #TempTable DROP COLUMN [indexfield]; INSERT INTO [TABLE] SELECT * FROM #TempTable; DROP TABLE #TempTable;
cette façon, je sais qu'il sera nettoyé dès que possible sans aucun retard de l'écriture d'un fichier intermittent sur le disque.$identity
si vous ne voulez pas coder en dur le nom de votre colonne d'identitéJe suppose que vous essayez d'éviter d'écrire tous les noms de colonnes. Si vous utilisez SQL Management Studio, vous pouvez facilement cliquer avec le bouton droit de la souris sur la table et Script As Insert .. alors vous pouvez jouer avec cette sortie pour créer votre requête.
la source
Spécifiez tous les champs sauf votre champ ID.
la source
J'ai le même problème où je veux qu'un seul script fonctionne avec une table qui a des colonnes ajoutées périodiquement par d'autres développeurs. Non seulement cela, mais je prends en charge de nombreuses versions différentes de notre base de données car les clients ne sont peut-être pas tous à jour avec la version actuelle.
J'ai pris la solution de Jonas et l'ai légèrement modifiée. Cela me permet de faire une copie de la ligne, puis de modifier la clé primaire avant de l'ajouter à nouveau dans la table source d'origine. C'est également très pratique pour travailler avec des tables qui n'autorisent pas les valeurs NULL dans les colonnes et vous ne voulez pas avoir à spécifier chaque nom de colonne dans INSERT.
Ce code copie la ligne de «ABC» vers «XYZ»
Une fois que vous avez terminé, déposez la table temporaire.
la source
Je sais que ma réponse est en retard à la fête. Mais la façon dont j'ai résolu est un peu différente de toutes les réponses.
J'ai eu une situation, j'ai besoin de cloner une ligne dans un tableau sauf quelques colonnes. Ces quelques-uns auront de nouvelles valeurs. Ce processus doit prendre en charge automatiquement les modifications futures de la table. Cela implique de cloner l'enregistrement sans spécifier de nom de colonne.
Mon approche est de,
la source
la source
Si "clé" est votre champ PK et qu'il est autonumérique.
il générera un nouvel enregistrement, en copiant champ1 et champ2 à partir de l'enregistrement d'origine
la source
Ma table contient 100 champs et j'avais besoin d'une requête pour fonctionner. Maintenant, je peux changer n'importe quel nombre de champs avec une logique conditionnelle de base et ne pas me soucier de sa position ordinale.
Remplacez le nom de la table ci-dessous par le nom de votre table
Remplacez le nom du champ d'identité d'origine par votre nom de champ PK
Remplacez à nouveau les noms de table (nom de la table cible et nom de la table source); modifier vos
where
conditionsla source
Vous pouvez faire comme ceci:
Là, au lieu de 112, vous devez mettre un numéro de l'identifiant maximum dans la table DENI / FRIEN01P.
la source
Voici comment je l'ai fait en utilisant ASP classic et je n'ai pas tout à fait réussi à le faire fonctionner avec les réponses ci-dessus et je voulais pouvoir copier un produit de notre système vers un nouveau product_id et j'en avais besoin pour pouvoir fonctionner même lorsque nous ajoutez plus de colonnes au tableau.
la source