Quelle est la meilleure façon de générer automatiquement des instructions INSERT pour une table SQL Server?

Nous écrivons une nouvelle application, et lors du test, nous avons besoin d'un tas de données factices. J'ai ajouté ces données en utilisant MS Access pour vider les fichiers excel dans les tableaux pertinents.

de temps en temps, nous voulons "rafraîchir" les tables concernées, ce qui signifie les laisser tomber, les recréer, et exécuter une requête d'ajout d'accès ms sauvegardé.

la première partie (laisser tomber et recréer) est un script sql facile, mais la dernière partie me fait craquer. Je je veux un seul script de configuration qui a un tas d'INSERTs pour régénérer les données factices.

j'ai les données dans les tables. Quelle est la meilleure façon de générer automatiquement une grande liste D'instructions INSERT à partir de cet ensemble de données?

la seule façon que je peux penser de le faire est de sauver la table à une feuille excel et ensuite écrire une formule excel pour créer un INSERT pour chaque ligne, qui n'est sûrement pas la meilleure façon.

j'utilise le 2008 Studio de gestion pour se connecter à une base de données SQL Server 2005.

493
demandé sur JosephStyons 2009-06-11 21:42:28

19 réponses

Microsoft devrait annoncer cette fonctionnalité de SSMS 2008. La fonctionnalité que vous recherchez est intégrée dans l'utilitaire Generate Script , mais la fonctionnalité est désactivée par défaut et doit être activée lors du script d'une table.

il s'agit d'un passage rapide pour générer les déclarations INSERT pour toutes les données de votre table, en utilisant aucun script ou add-In À SQL Management Studio 2008:

  1. Faites un clic droit sur la base de données et allez à tâches > générer des Scripts .
  2. sélectionnez les tables (ou les objets) contre lesquelles vous voulez générer le script.
  3. passez à définissez les options de script et cliquez sur le bouton avancé .
  4. dans la catégorie général , passez à Type de données à script
  5. il y a 3 options: schéma seulement , données seulement , et schéma et données . Sélectionnez l'option appropriée et cliquez sur OK .

vous obtiendrez alors la déclaration CREATE TABLE et toutes les déclarations INSERT pour les données directement à partir de SSMS.

850
répondu Mike Ritacco 2016-06-08 15:30:56

nous utilisons cette procédure stockée - elle vous permet de cibler des tables spécifiques, et d'utiliser où des clauses. Vous pouvez trouver le texte ici .

par exemple, il vous permet de faire ceci:

EXEC sp_generate_inserts 'titles'
76
répondu Shane Fulmer 2018-06-22 14:46:23

comme mentionné par @Mike Ritacco mais mis à jour pour le SSMS 2008 R2

  1. clic droit sur le nom de la base de données
  2. choisir des tâches > générer des scripts
  3. selon vos paramètres, la page d'introduction peut afficher ou non
  4. , Choisissez "Sélectionner des objets de base de données',
  5. étendre la vue sur l'arbre et vérifier les tables pertinentes
  6. Cliquez Sur Suivant
  7. Cliquez Sur Avancé
  8. dans la section générale, choisissez l'option appropriée pour 'Types de données à script'
  9. Terminer l'assistant

vous obtiendrez alors tous les INSERT statements pour les données directement à partir de SSMS.

EDIT 2016-10-25 SQL Server 2016/SSMS 13.0.15900.1

  1. clic droit sur le nom de la base de données

  2. choisir des tâches > générer des scripts

  3. selon vos paramètres la page d'introduction peut afficher ou non

  4. , Choisissez "Sélectionner des objets de base de données',

  5. étendre la vue sur l'arbre et vérifier les tableaux pertinents

  6. Cliquez Sur Suivant

  7. Cliquez Sur Avancé

  8. sous section générale, choisissez l'option appropriée pour les Types de données à script '

  9. Cliquez sur OK

  10. choisissez si vous voulez que la sortie aille à une nouvelle requête, le bloc-notes ou un dossier

  11. cliquez deux fois

  12. votre script est préparé en conformément aux paramètres que vous avez choisi ci-dessus

  13. Cliquez Sur Terminer

40
répondu noonand 2016-12-31 18:31:14

vous pouvez utiliser le pack D'outils SSMS (disponible pour SQL Server 2005 et 2008). Il est livré avec une fonctionnalité pour générer des états d'insertion.

http://www.ssmstoolspack.com /

27
répondu BinaryHacker 2009-07-12 19:48:19

cela peut être fait en utilisant Visual Studio aussi (au moins à partir de la version 2013).

dans VS 2013 il est également possible de filtrer la liste des lignes sur lesquelles se base l'instruction inserts, c'est quelque chose qui n'est pas possible dans les SSM comme je le sais.

effectuer les étapes suivantes:

  • ouvrir la fenêtre" SQL Server Object Explorer "(menu: /View/SQL Server Object Explorer)
  • ouvrir / étendre la base de données et ses tables
  • cliquez avec le bouton droit de la souris sur la table et choisissez "visualiser les données" dans le menu contextuel
  • cela affichera les données dans la zone principale
  • étape facultative: cliquez sur l'icône du filtre "trier et filtrer les données" (la quatrième icône à partir de la gauche sur la ligne au-dessus du résultat) et appliquer un filtre à une ou plusieurs colonnes
  • cliquez sur les icônes "Script" ou" Script to File" (les icônes à droite de la rangée du haut ressemblent à de petites feuilles de papier)

cela créera les instructions (conditionnelles) insert pour la table sélectionnée dans la fenêtre ou le fichier actif.



Le "Filtre" et "Script" boutons de Visual Studio 2013 :

enter image description here

26
répondu Martin 2016-06-27 09:44:40

j'utilise la version SSMS 2008 10.0.5500.0. Dans cette version comme partie de L'Assistant générer des Scripts, au lieu d'un bouton Avancé, il y a l'écran ci-dessous. Dans ce cas, je voulais juste les données insérées et pas d'instructions create, donc j'ai dû changer les deux propriétés encerclées Script Options

23
répondu Erikest 2012-04-05 08:01:03

le premier lien vers sp_generate_inserts est assez cool, voici une version très simple:

DECLARE @Fields VARCHAR(max); SET @Fields = '[QueueName], [iSort]' -- your fields, keep []
DECLARE @Table  VARCHAR(max); SET @Table  = 'Queues'               -- your table

DECLARE @SQL    VARCHAR(max)
SET @SQL = 'DECLARE @S VARCHAR(MAX)
SELECT @S = ISNULL(@S + '' UNION '', ''INSERT INTO ' + @Table + '(' + @Fields + ')'') + CHAR(13) + CHAR(10) + 
 ''SELECT '' + ' + REPLACE(REPLACE(REPLACE(@Fields, ',', ' + '', '' + '), '[', ''''''''' + CAST('),']',' AS VARCHAR(max)) + ''''''''') +' FROM ' + @Table + '
PRINT @S'

EXEC (@SQL)

Sur mon système, j'obtiens ce résultat:

INSERT INTO Queues([QueueName], [iSort])
SELECT 'WD: Auto Capture', '10' UNION 
SELECT 'Car/Lar', '11' UNION 
SELECT 'Scan Line', '21' UNION 
SELECT 'OCR', '22' UNION 
SELECT 'Dynamic Template', '23' UNION 
SELECT 'Fix MICR', '41' UNION 
SELECT 'Fix MICR (Supervisor)', '42' UNION 
SELECT 'Foreign MICR', '43' UNION 
...
8
répondu johnnycrash 2012-02-24 14:39:48

ma contribution au problème, un générateur de script INSERT Powershell qui vous permet de script plusieurs tables sans avoir à utiliser L'interface graphique du SSMS. Idéal pour les données de "semences" qui persistent rapidement dans le contrôle à la source.

  1. sauvegardez le script ci-dessous comme" nom du fichier.ps1".
  2. faites vos propres modifications aux zones sous "personnalisez-moi".
  3. vous pouvez ajouter la liste des tables au script dans n'importe quel ordre.
  4. vous pouvez ouvrir le script dans Powershell ISE et appuyer sur le bouton Play, ou simplement exécuter le script dans L'invite de commande Powershell.

par défaut, le script INSERT généré sera " SeedData.sql" dans le même dossier que le script.

vous aurez besoin des assemblages D'objets de gestion de Serveur SQL installés, qui devraient être là si vous avez des SSMS installés.

Add-Type -AssemblyName ("Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")
Add-Type -AssemblyName ("Microsoft.SqlServer.ConnectionInfo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")



#CUSTOMIZE ME
$outputFile = ".\SeedData.sql"
$connectionString = "Data Source=.;Initial Catalog=mydb;Integrated Security=True;"



$sqlConnection = new-object System.Data.SqlClient.SqlConnection($connectionString)
$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection($sqlConnection)
$srv = new-object Microsoft.SqlServer.Management.Smo.Server($conn)
$db = $srv.Databases[$srv.ConnectionContext.DatabaseName]
$scr = New-Object Microsoft.SqlServer.Management.Smo.Scripter $srv
$scr.Options.FileName = $outputFile
$scr.Options.AppendToFile = $false
$scr.Options.ScriptSchema = $false
$scr.Options.ScriptData = $true
$scr.Options.NoCommandTerminator = $true

$tables = New-Object Microsoft.SqlServer.Management.Smo.UrnCollection



#CUSTOMIZE ME
$tables.Add($db.Tables["Category"].Urn)
$tables.Add($db.Tables["Product"].Urn)
$tables.Add($db.Tables["Vendor"].Urn)



[void]$scr.EnumScript($tables)

$sqlConnection.Close()
6
répondu chuck 2015-05-12 15:39:55

si vous avez besoin d'un accès programmatique, alors vous pouvez utiliser une procédure stockée open source `GenerateInsert.

insérer l'énoncé générateur

tout comme un exemple simple et rapide, pour générer insérer des instructions pour une table AdventureWorks.Person.AddressType exécuter les instructions suivantes:

USE [AdventureWorks];
GO
EXECUTE dbo.GenerateInsert @ObjectName = N'Person.AddressType';

générera le script suivant:

SET NOCOUNT ON
SET IDENTITY_INSERT Person.AddressType ON
INSERT INTO Person.AddressType
([AddressTypeID],[Name],[rowguid],[ModifiedDate])
VALUES
 (1,N'Billing','B84F78B1-4EFE-4A0E-8CB7-70E9F112F886',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(2,N'Home','41BC2FF6-F0FC-475F-8EB9-CEC0805AA0F2',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(3,N'Main Office','8EEEC28C-07A2-4FB9-AD0A-42D4A0BBC575',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(4,N'Primary','24CB3088-4345-47C4-86C5-17B535133D1E',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(5,N'Shipping','B29DA3F8-19A3-47DA-9DAA-15C84F4A83A5',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(6,N'Archive','A67F238A-5BA2-444B-966C-0467ED9C427F',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
SET IDENTITY_INSERT Person.AddressType OFF
6
répondu drumsta 2015-12-14 22:26:59

peut-être Pouvez-vous essayer L'Assistant de publication SQL Server http://www.microsoft.com/downloads/details.aspx?FamilyId=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en

il a un assistant qui vous aide script insert statements.

4
répondu janem 2009-07-12 02:59:59

N'utilisez pas d'inserts, utilisez BCP

3
répondu ShuggyCoUk 2009-06-11 17:48:45

j'ai utilisé ce script que j'ai mis sur mon blog ( Comment-pour produire de l'instruction Insert procédures sur sql server ).

jusqu'à présent a fonctionné pour moi, bien qu'ils puissent être des bogues que je n'ai pas encore découverts .

3
répondu Yordan Georgiev 2015-01-30 14:29:45

GenerateData est un formidable outil pour cela. Il est également très facile d'y apporter des modifications parce que le code source est à votre disposition. Quelques belles caractéristiques:

  • générateur de noms pour les noms et les lieux des peuples
  • possibilité d'enregistrer le profil de génération (après qu'il est téléchargé et configuré localement)
  • possibilité de personnaliser et de manipuler la génération à travers des scripts
  • De nombreuses sorties différentes (CSV, Javascript, JSON, etc.) pour les données (dans le cas où vous avez besoin de tester le jeu dans des environnements différents et de vouloir sauter à la base de données access)
  • Libre . Mais envisagez de faire un don si vous trouvez le logiciel utile :).

GUI

3
répondu Klik 2016-09-08 07:04:28

j'utilise sqlite pour faire ceci. Je le trouve très, très utile pour créer des bases de données scratch/test.

sqlite3 foo.sqlite .dump > foo_as_a_bunch_of_inserts.sql

2
répondu Paul Harrington 2009-07-22 17:31:17

avez-vous des données dans une base de données de production? Si c'est le cas, vous pouvez configurer une période de rafraîchissement des données via DTS. Nous faisons les nôtres chaque semaine le week-end et il est très agréable d'avoir des données propres et réelles chaque semaine pour nos tests.

si vous n'avez pas encore de production, alors vous devez créer une base de données qu'ils veulent que vous la vouliez (fresh). Ensuite, dupliquez cette base de données et utilisez cette base de données nouvellement créée comme votre environnement de test. Quand vous voulez la version propre, simplement dupliquez votre propre encore une fois et Bob's your uncle .

1
répondu Nick DeVore 2009-06-11 18:11:12

pas sûr, si je comprends bien votre question.

si vous avez des données dans MS-Access, que vous voulez déplacer vers SQL Server - vous pouvez utiliser DTS.

Et, je suppose que vous pourriez utiliser SQL profiler pour voir toutes les instructions INSERT passer, je suppose.

0
répondu shahkalpesh 2009-06-11 17:52:00

j'ai aussi fait des recherches sur ce sujet, mais je n'ai pas pu trouver la solution concrète. Actuellement, l'approche que je suis est de copier le contenu dans excel à partir de SQL Server Managment studio, puis importer les données dans Oracle-TOAD et ensuite générer les insert statements

0
répondu 2009-07-16 02:39:40

pourquoi ne pas simplement sauvegarder les données avant de votre travail avec elle, puis restaurer quand vous voulez être actualisé?

si vous devez générer des inserts, essayez http://vyaskn.tripod.com/code.htm#inserts

-1
répondu KM. 2009-06-11 17:44:14