¿Cuál es la mejor manera de generar automáticamente instrucciones INSERT para una tabla SQL Server?


Estamos escribiendo una nueva aplicación, y mientras probamos, necesitaremos un montón de datos ficticios. He añadido que los datos mediante el uso de MS Access para volcar archivos de Excel en las tablas pertinentes.

De vez en cuando, queremos "actualizar" las tablas relevantes, lo que significa eliminarlas todas, volver a crearlas y ejecutar una consulta de MS Access append guardada.

La primera parte (dejar caer y volver a crear) es un script sql fácil, pero la última parte me hace temblar. Quiero un solo script de instalación que tenga un montón de insertos para regenerar los datos ficticios.

Ahora tengo los datos en las tablas. ¿Cuál es la mejor manera de generar automáticamente una gran lista de instrucciones INSERT a partir de ese conjunto de datos?

La única manera que se me ocurre de hacerlo es guardar la tabla en una hoja de excel y luego escribir una fórmula de excel para crear un INSERTO para cada fila, que seguramente no es la mejor manera.

Estoy usando el 2008 Management Studio para conectarme a una base de datos SQL Server 2005.

Author: JosephStyons, 2009-06-11

19 answers

Microsoft debería anunciar esta funcionalidad de SSMS 2008. La característica que está buscando está integrada en la utilidad Generate Script, pero la funcionalidad está desactivada de forma predeterminada y debe estar habilitada al crear scripts en una tabla.

Esta es una ejecución rápida para generar las instrucciones INSERT para todos los datos de la tabla, sin usar scripts ni complementos para SQL Management Studio 2008:

  1. Haga clic con el botón derecho en la base de datos y vaya a Tareas > Generar Scripts .
  2. Seleccione las tablas (u objetos) con las que desea generar el script.
  3. Vaya a la pestaña Set scripting optionsy haga clic en el botón Advanced.
  4. En la categoría General , vaya a Tipo de datos a script
  5. Hay 3 opciones: Solo Esquema, Solo Datos , y Esquema y Datos. Seleccione la opción apropiada y haga clic en OK .

Entonces obtendrá el CREATE TABLE declaración y todas las declaraciones INSERT para los datos directamente de los SSM.

 850
Author: Mike Ritacco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-08 15:30:56

Utilizamos este procedimiento almacenado: le permite dirigirse a tablas específicas y usar cláusulas where. Puede encontrar el texto aquí.

Por ejemplo, te permite hacer esto:

EXEC sp_generate_inserts 'titles'
 76
Author: Shane Fulmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-22 14:46:23

Como mencionó @Mike Ritacco pero actualizado para SSMS 2008 R2

  1. Haga clic derecho en el nombre de la base de datos
  2. Elija Tareas > Generar scripts
  3. Dependiendo de su configuración, la página de introducción puede mostrar o no
  4. Elija 'Seleccionar objetos de base de datos específicos',
  5. Expanda la vista de árbol y compruebe las tablas pertinentes
  6. Haga clic en Siguiente
  7. Haga clic en Avanzado
  8. En la sección General, elija la opción apropiada para'Tipos de datos a script'
  9. Completo el asistente

A continuación, obtendrá todas las instrucciones INSERT para los datos directamente de los SSM.

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

  1. Haga clic derecho en el nombre de la base de datos

  2. Elija Tareas > Generar scripts

  3. Dependiendo de su configuración, la página de introducción puede mostrar o no

  4. Elija 'Seleccionar objetos de base de datos específicos',

  5. Expanda la vista de árbol y compruebe el cuadros

  6. Haga clic en Siguiente

  7. Haga clic en Avanzado

  8. En la sección General, elija la opción adecuada para ' Tipos de datos para script '

  9. Haga clic en Aceptar

  10. Elija si desea que la salida vaya a una nueva consulta, el portapapeles o un file

  11. Haga clic en Siguiente dos veces

  12. Su script está preparado de acuerdo con la configuración que eligió anteriormente

  13. Haga clic en Finalizar

 40
Author: noonand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-31 18:31:14

Puede utilizar el paquete de herramientas SSMS (disponible para SQL Server 2005 y 2008). Viene con una función para generar instrucciones insert.

Http://www.ssmstoolspack.com/

 27
Author: BinaryHacker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-12 19:48:19

Esto se puede hacer usando Visual Studio también (al menos en la versión 2013 en adelante).

En VS 2013 también es posible filtrar la lista de filas en las que se basa la instrucción inserts, esto es algo que no es posible en SSMS como para que yo sepa.

Realice los siguientes pasos:

  • Abra la ventana" SQL Server Object Explorer " (menú: /View/SQL Server Object Explorer)
  • Abrir / expandir la base de datos y sus tablas
  • Haga clic derecho en la tabla y elija "Ver datos" desde el menú contextual
  • Esto mostrará los datos en el área principal
  • Paso opcional: Haga clic en el icono de filtro "Ordenar y filtrar conjunto de datos" (el cuarto icono de la izquierda en la fila por encima del resultado) y aplique algún filtro a una o más columnas
  • Haga clic en los iconos" Script "o" Script to File " (los iconos a la derecha de la fila superior, parecen pequeñas hojas de papel)

Esto creará las instrucciones (condicionales) insert para el tabla a la ventana o archivo activo.


Los botones" Filtro "y" Script " Visual Studio 2013:

introduzca la descripción de la imagen aquí

 26
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-27 09:44:40

Estoy usando SSMS 2008 versión 10.0.5500.0. En esta versión como parte del asistente para generar scripts, en lugar de un botón Avanzado, está la pantalla a continuación. En este caso, solo quería insertar los datos y no crear instrucciones, así que tuve que cambiar las dos propiedades con un círculo Opciones de Script

 23
Author: Erikest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-05 08:01:03
 13
Author: harriyott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-02 09:40:44

El primer enlace a sp_generate_inserts es bastante genial, aquí hay una versión realmente 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)

En mi sistema, obtengo este resultado:

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
Author: johnnycrash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-24 14:39:48

Mi contribución al problema, un generador de scripts de INSERCIÓN de Powershell que le permite escribir varias tablas sin tener que usar la engorrosa interfaz gráfica de usuario de SSMS. Ideal para persistir rápidamente los datos de "semilla" en el control de origen.

  1. Guarde el siguiente script como "filename.ps1".
  2. Haga sus propias modificaciones en las áreas bajo "PERSONALÍZAME".
  3. Puede añadir la lista de tablas al script en cualquier orden.
  4. Puede abrir el script en Powershell ISE y pulsar el botón Reproducir, o simplemente ejecute el script en el símbolo del sistema de Powershell.

Por defecto, el script INSERT generado será "SeedData.sql " en la misma carpeta que el script.

Necesitará los ensamblados de Objetos de administración de SQL Server instalados, que deberían estar allí si tiene SSMS instalados.

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
Author: chuck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-12 15:39:55

Si necesita un acceso programático, puede usar GenerateInsert de un procedimiento almacenado de código abierto.

INSERT statement (s) generator

Solo como un ejemplo simple y rápido, para generar instrucciones INSERT para una tabla AdventureWorks.Person.AddressType ejecute las siguientes instrucciones:

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

Esto generará el siguiente script:

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
Author: drumsta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-14 22:26:59

Tal vez pueda probar el Asistente de publicación de SQL Server http://www.microsoft.com/downloads/details.aspx?FamilyId=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en

Tiene un asistente que le ayuda a insertar instrucciones de script.

 4
Author: janem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-12 02:59:59

No use insertos, use BCP

 3
Author: ShuggyCoUk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-11 17:48:45

Usé este script que he puesto en mi blog ( Cómo generar procedimientos de instrucción Insert en sql server).

Hasta ahora ha funcionado para mí, aunque podrían ser errores que aún no he descubierto .

 3
Author: Yordan Georgiev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-30 14:29:45

GenerateData es una herramienta increíble para esto. También es muy fácil hacer ajustes porque el código fuente está disponible para usted. Algunas características agradables:

  • Generador de nombres para nombres de pueblos y lugares
  • Capacidad para guardar el perfil de generación (después de descargarlo y configurarlo localmente)
  • Capacidad para personalizar y manipular la generación a través de scripts
  • Muchas salidas diferentes (CSV, Javascript, JSON, etc.) para los datos (en caso de que necesite probar el establecer en diferentes entornos y desea omitir el acceso a la base de datos)
  • Libre . Pero considere donar si encuentra el software útil :).

GUI

 3
Author: Klik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-08 07:04:28

Uso sqlite para hacer esto. Lo encuentro muy, muy útil para crear bases de datos scratch / test.

sqlite3 foo.sqlite .dump > foo_as_a_bunch_of_inserts.sql

 2
Author: Paul Harrington,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-22 17:31:17

¿Ya tiene datos en una base de datos de producción? Si es así, puede configurar una actualización de período de los datos a través de DTS. Hacemos el nuestro semanalmente los fines de semana y es muy agradable tener datos limpios y reales cada semana para nuestras pruebas.

Si aún no tienes producción, entonces deberías crear una base de datos que sea lo que quieren que quieras (fresca). Luego, duplique esa base de datos y use esa base de datos recién creada como su entorno de prueba. Cuando desee la versión limpia, simplemente duplique su versión limpia una vez más y Bob es tu tío .

 1
Author: Nick DeVore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-11 18:11:12

No estoy seguro, si entiendo su pregunta correctamente.

Si tiene datos en MS-Access, que desea mover a SQL Server, podría usar DTS.
Y, supongo que podría utilizar SQL profiler para ver todas las instrucciones de INSERCIÓN pasando, supongo.

 0
Author: shahkalpesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-11 17:52:00

También he investigado mucho sobre esto, pero no pude obtener la solución concreta para esto. Actualmente, el enfoque que sigo es copiar el contenido en excel desde SQL Server Managment studio y luego importar los datos en Oracle-TOAD y luego generar las instrucciones insert

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-16 02:39:40

¿Por qué no simplemente hacer una copia de seguridad de los datos antes de trabajar con él, y luego restaurarlos cuando desee que se actualicen?

Si debe generar insertos, intente: http://vyaskn.tripod.com/code.htm#inserts

 -1
Author: KM.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-11 17:44:14