Dans notre base de données, il y a un tableau qui a un peu plus de 80 colonnes. Il a une clé primaire et l'insertion d'identité est activée. Je cherche un moyen d'insérer dans cette table chaque colonne SAUF la colonne de clé primaire d'une table identique dans une base de données différente.
Est-ce possible?
Vous pouvez le faire assez facilement en fait:
-- Select everything into temp table
Select * Into
#tmpBigTable
From [YourBigTable]
-- Drop the Primary Key Column from the temp table
Alter Table #tmpBigTable Drop Column [PrimaryKeyColumn]
-- Insert that into your other big table
Insert Into [YourOtherBigTable]
Select * From #tmpBigTable
-- Drop the temp table you created
Drop Table #tmpBigTable
À condition que vous ayez activé l’insertion d’identité dans "YourOtherBigTable" et que les colonnes soient absolument identiques, tout ira bien.
Vous pouvez interroger Information_Schema pour obtenir une liste de toutes les colonnes et générer par programme les noms de colonnes pour votre requête. Si vous faites tout cela en t-sql, ce serait lourd, mais cela pourrait être fait. Si vous utilisez un autre langage client, comme C # pour effectuer l'opération, ce serait un peu moins lourd.
CREATE TABLE Tests
(
TestID int IDENTITY PRIMARY KEY,
A int,
B int,
C int
)
INSERT INTO dbo.Tests
VALUES (1,2,3)
SELECT * FROM Tests
Cela fonctionne dans SQL 2012
Non, ce n'est pas possible. Vous pourriez être tenté d'utiliser
INSERT INTO MyLargeTable SELECT * FROM OtherTable
Mais cela ne fonctionnerait pas, car votre colonne d'identité serait incluse dans le *.
Vous pourriez utiliser
SET IDENTITY_INSERT MyLargeTable ON
INSERT INTO MyLargeTable SELECT * FROM OtherTable
SET IDENTITY_INSERT MyLargeTable OFF
vous activez d'abord l'insertion de valeurs d'identité, puis vous copiez les enregistrements, puis vous réactivez la colonne d'identité.
Mais cela ne fonctionnera pas non plus. Le serveur SQL n'accepte pas le * dans ce cas. Vous devez inclure explicitement l'ID dans le script, comme:
SET IDENTITY_INSERT MyLargeTable ON
INSERT INTO MyLargeTable (Id, co1, col2, ...., col80) SELECT Id, co1, col2, ...., col80 FROM OtherTable
SET IDENTITY_INSERT MyLargeTable OFF
Nous sommes donc de retour d'où nous avons commencé.
Le moyen le plus simple consiste à cliquer avec le bouton droit sur la table dans Management Studio, à la laisser générer les scripts INSERT et SELECT, et à les modifier un peu pour les laisser fonctionner ensemble.
Pourquoi ne pas simplement créer une VUE des données d'origine, en supprimant les champs indésirables? Ensuite, 'Select * into' votre cœur désire.
Vraiment, honnêtement, il faut dix secondes ou moins pour extraire toutes les colonnes du navigateur d'objets, puis supprimer la colonne d'identité de la liste. C'est une mauvaise idée d'utiliser select * pour autre chose qu'une requête ad hoc rapide.