web-dev-qa-db-fra.com

Insertion T-SQL dans la table sans avoir à spécifier chaque colonne

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?

23
Eric

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.

54
Ta01

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.

2
Kibbee
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

2
Dave Mateer

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.

2
Wim

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.

  • Contrôle localisé dans une seule vue
  • Pas besoin de modifier SPROC
  • Ajouter/modifier/supprimer des champs facilement
  • Pas besoin d'interroger les métadonnées
  • Pas de tables temporaires
1
davidWazy

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.

0
HLGEM