SQL: Insérer tous les loggings d'une table vers une autre table sans les colonnes spécifiques

Je veux insert tous les loggings de la table de sauvegarde foo_bk dans la table foo sans spécifier les colonnes.

si j'essaye cette requête

INSERT INTO foo SELECT * FROM foo_bk 

j'obtiendrai une erreur "Erreur d'insertion: le nom de la colonne ou le nombre de valeurs fournies ne correspond pas à la définition de la table."

Est-il possible de faire un encart en masse d'une table à une autre sans fournir le nom de la colonne? J'ai google mais je n'arrive pas à find une réponse. toute la réponse nécessite des colonnes spécifiques.

Tu ne devrais jamais vouloir faire ça. Select * ne doit pas être utilisé comme base pour une insertion car les colonnes peuvent être déplacées et casser votre insertion (ou pire ne pas casser votre insertion mais gâcher vos données) Supposons que quelqu'un ajoute une colonne à la table dans le select mais pas le Vous supposez que quelqu'un, pour des raisons qui surpassent la compréhension mais arrive souvent, décide de faire une chute et de recréer sur une table et de déplacer les colonnes dans un ordre différent. Dans l'original et select * le mettra dans la mauvaise colonne de l'autre table, il est extrêmement difficile de ne pas spécifier les colonnes et le mappage spécifique d'une colonne à la colonne que vous voulez dans la table qui vous intéresse.

En ce moment, vous pouvez avoir plusieurs problèmes, d'abord les deux structures ne correspondent pas directement ou secondes la table à insert a une colonne d'identité et donc même si les colonnes insérables sont une correspondance directe, la table insérée a une colonne de plus que l'autre et en ne spécifiant pas la database suppose que vous allez essayer d'insert dans cette colonne. Ou vous pourriez avoir le même nombre de colonnes mais une est une identité et ne peut donc pas être insérée dans (bien que je pense que ce serait un message d'erreur différent).

Par cet autre post: Insérer toutes les valeurs d'un … , vous pouvez faire ce qui suit:

 INSERT INTO new_table (Foo, Bar, Fizz, Buzz) SELECT Foo, Bar, Fizz, Buzz FROM initial_table 

Il est important de spécifier les noms des colonnes comme indiqué par les autres réponses.

Utilisez ceci

 SELECT * INTO new_table_name FROM current_table_name 

Vous devez avoir au less le même nombre de colonnes et chaque colonne doit être définie exactement de la même manière, c'est-à-dire qu'une colonne varchar ne peut pas être insérée dans une colonne int.

Pour le transfert groupé, consultez la documentation de l'implémentation SQL que vous utilisez. Il y a souvent des outils disponibles pour transférer des données en vrac d'une table à l'autre. Pour SqlServer 2005, par exemple, vous pouvez utiliser l'Assistant Importation et Exportation de SQL Server. Cliquez avec le button droit sur la database dans laquelle vous essayez de déplacer des données et click Exporter pour y accéder.

SQL 2008 vous permet de renoncer à spécifier des noms de colonnes dans votre SELECT si vous utilisez SELECT INTO plutôt que INSERT INTO / SELECT:

 SELECT * INTO Foo FROM Bar WHERE x=y 

La clause INTO existe dans SQL Server 2000-2005, mais nécessite toujours la spécification de noms de colonnes. 2008 semble append la possibilité d'utiliser SELECT *.

Voir les articles MSDN sur INTO ( SQL2005 ), ( SQL2008 ) pour plus de détails.

La clause INTO ne fonctionne que si la table de destination n'existe pas encore. Si vous cherchez à append des loggings à une table existante, cela n'aidera pas.

Comme vous l'avez probablement compris à partir des réponses précédentes, vous ne pouvez pas vraiment faire ce que vous searchz. Je pense que vous pouvez comprendre le problème que rencontre SQL Server sans savoir comment mapper les colonnes supplémentaires / manquantes.

Cela dit, puisque vous mentionnez que le but de ce que vous essayez ici est de sauvegarde, peut-être que nous pouvons travailler avec SQL Server et contourner le problème. Ne pas connaître votre scénario exact, il est impossible de bash avec une bonne réponse ici, mais je suppose ce qui suit:

  • Vous souhaitez gérer un process de sauvegarde / audit pour une table.
  • Vous en avez probablement quelques-uns et vous souhaitez éviter de modifier les objects dépendants à chaque ajout / suppression de colonne.
  • La table de sauvegarde peut contenir des colonnes supplémentaires à des fins d'audit.

Je souhaite proposer deux options pour vous:

La pratique efficace (IMO) pour cela peut être de détecter les changements de schéma en utilisant des triggersurs DDL et de les utiliser pour modifier la table de sauvegarde en conséquence. Cela vous permettra d'utiliser l'approche 'select * from …', car la list des colonnes sera cohérente entre les deux tables.

J'ai utilisé cette approche avec succès et vous pouvez l'utiliser pour que les triggersurs DDL gèrent automatiquement vos tables d'audit. Dans mon cas, j'ai utilisé une convention de nommage pour une table nécessitant des vérifications et le triggersur DDL l'a géré à la volée.

Une autre option qui pourrait être utile pour votre scénario spécifique consiste à créer une vue de prise en charge pour les tables alignant la list de colonnes. Voici un exemple rapide:

 create table foo (id int, name varchar(50)) create table foo_bk (id int, name varchar(50), tagid int) go create view vw_foo as select id,name from foo go create view vw_foo_bk as select id,name from foo_bk go insert into vw_foo select * from vw_foo_bk go drop view vw_foo drop view vw_foo_bk drop table foo drop table foo_bk go 

J'espère que ça aide 🙂