2009-06-15 9 views
16

Me gustaría exportar un conjunto de resultados de consulta Select ad hoc de SQL Server para exportar directamente como Insertar declaraciones.¿Herramienta para exportar conjunto de resultados de SQL a instrucciones de inserción?

Me encantaría ver una opción Guardar como "Insertar ..." junto con las otras opciones disponibles actuales (csv, txt) cuando hace clic derecho en SSMS. No exporto desde una tabla física existente y no tengo permisos para crear nuevas tablas, por lo que las opciones para crear scripts de tablas físicas no son una opción para mí.

Tengo que crear una secuencia de comandos de tablas temporales o del conjunto de resultados en la ventana de consulta.

Ahora puedo exportar a csv y luego importar ese archivo en otra tabla, pero eso lleva mucho tiempo para el trabajo repetitivo.

La herramienta debe crear Inserciones adecuadas y comprender los tipos de datos cuando crea valores para valores NULOS.

+0

Si no está exportando de una tabla existente, ¿cómo diablos espera obtener una declaración seleccionada convertida en una declaración de inserción? – Eric

+0

Sí, ¿está asumiendo que solo puede insertar desde una tabla con un esquema idéntico o algo así? No entiendo la dificultad. – dkretz

+1

Cuando ejecuto una instrucción select, obtengo un conjunto de resultados. Quiero exportar este conjunto de resultados como un montón de instrucciones de inserción para recrear el mismo conjunto de resultados en otro lugar. Olvídate de cualquier tabla existente. – Abdu

Respuesta

11

eche un vistazo al complemento SSMS Tools Pack para SSMS que le permite hacer justo lo que necesita.

+0

Esto crea desde una tabla existente. Necesito crear desde el conjunto de resultados en la ventana de consulta. – Abdu

+0

puede hacerlo también. Haga clic derecho en el conjunto de resultados y elija Resultados de la cuadrícula de scripts. –

+0

Tenga en cuenta que @MladenPrajdic es el autor del programa (¡gracias!) Y que SSMS Tools Pack se ha convertido en un producto comercial de 2.5.0.0 lanzado el 18.09.2011. Hay una versión demo de 30 días disponible, más versiones anteriores que todavía son gratuitas. –

2

Yo sé que no es exactamente lo que está buscando, pero se puede hacer una inserción fuera de una instrucción de selección:

INSERT INTO TBL (a, b) seleccionar C, D desde TBL2 donde C EN (...)

Obviamente esto es bastante duro, pero espero que sea el punto de lo que estoy tratando de decir.

+0

Quiero listo para ejecutar Insertar declaraciones para que pueda copiarlas para que se ejecuten en otro lugar. – Abdu

+0

Además, no puedo crear nuevas tablas si estás diciendo que tbl es una nueva tabla. Pensé que mi pregunta era bastante informativa. – Abdu

13

Personalmente, me gustaría escribir una selección contra la mesa y generar las inserciones. Pedazo de pastel.

Por ejemplo:

SELECT 'insert into [pubs].[dbo].[authors](
        [au_id], 
        [au_lname], 
        [au_fname], 
        [phone], 
        [address], 
        [city], 
        [state], 
        [zip], 
        [contract]) 
    values(''' + 
    [au_id] + ''', ''' + 
    [au_lname] + ''', ''' + 
    [au_fname] + ''', ''' + 
    [phone] + ''', ''' + 
    [address] + ''', ''' + 
    [city] + ''', ''' + 
    [state] + ''', ''' + 
    [zip] + ''', ' + 
    cast([contract] as nvarchar) + ');' 
FROM [pubs].[dbo].[authors] 

producirá

insert into [pubs].[dbo].[authors](
        [au_id], 
        [au_lname], 
        [au_fname], 
        [phone], 
        [address], 
        [city], 
        [state], 
        [zip], 
        [contract]) 
    values('172-32-1176', 'White', 'Johnson', '408 496-7223', '10932 Bigge Rd.', 'Menlo Park', 'CA', '94025', 1); 
insert into [pubs].[dbo].[authors](
        [au_id], 
        [au_lname], 
        [au_fname], 
        [phone], 
        [address], 
        [city], 
        [state], 
        [zip], 
        [contract]) 
    values('213-46-8915', 'Green', 'Marjorie', '415 986-7020', '309 63rd St. #411', 'Oakland', 'CA', '94618', 1); 
... etc ... 

Un par de trampas:

  1. No se olvide de envolver sus cotizaciones individuales
  2. Esto supone una limpieza base de datos y no es seguro para Inyección SQL.
+0

Gracias, pero eso es aún más engorroso que exportar a un archivo y luego importar, especialmente aún más al escribir declaraciones complejas de selección. ¡Además de muchas comillas simples de las que preocuparse! :) – Abdu

0

Escribí un script para este problema que debería funcionar en cualquier tabla. (Digo "debería" porque la secuencia de comandos no está 100% probada y todavía es un poco difícil). Puede encontrarla en http://www.jessemclain.com/downloads/code/sql/spd_Tool_Get_Insert_Into_Values.sql.txt

Hay algunos desperdicios en la parte inferior del archivo que la empresa de hosting agrega, solo tira eso apagado. Para ejecutar, simplemente cambie el valor de @Source_Table a su tabla.

NOTA: el archivo de texto que publiqué se muestra bien en Firefox 3.0.11, pero no en IE7.

1

WinSQL en www.synametrics.com tiene esa característica y es bastante útil. No estoy seguro si esa característica está en la versión gratuita, pero de todos modos obtiene la versión Profesional para probar durante 30 días.

Es una herramienta de consulta muy práctica y fácil de usar para cualquier base de datos conectada a ODBC.

+0

. WinSQL lo hace. Lástima que solo está en la versión Pro que cuesta $ 249. – Abdu

1

TOAD puede hacerlo desde la cuadrícula de datos Guardar como menú.

+0

No se puede ver esto en la versión gratuita. Veo un Asistente de exportación y un formato de salida 'Script SQL' y luego dice que este formato no tiene licencia. Supongo que significa que necesito comprar la versión comercial. No estoy dispuesto a pagar $ 595 (su versión menos costosa) para tener esta característica. – Abdu

+0

Esta característica puede no estar disponible en todas las versiones y/o plataformas, estoy usando 9.7 para Oracle. En mi humilde opinión, TOAD vale fácilmente el precio de la entrada, aunque obviamente los presupuestos y las escalas de valor son diferentes. –

2

Squirrel SQL también pueden hacer esto.

Escriba una consulta SQL, ejecútela para probar. A continuación, resáltalo y selecciona la instrucción Script/Insert (no recuerdes la redacción exacta).

+1

En SQuirrel SQL Client Versión 3.2.1, la ruta del elemento de menú es "Sesión/Scripts/Crear secuencia de comandos de datos desde SQL". Acabo de volver a descubrirlo gracias a este comentario. ¡Gracias a Dios por SO! – chaotic3quilibrium

3

no es exactamente lo que el PO estaba pidiendo, pero si se desea generar una secuencia de comandos insert para todos registros en una tabla, puede hacerlo en SSMS (al menos 2012 - posiblemente versiones más antiguas) sin ningún adicional complementos.

Haga clic derecho en la base de datos que contiene la tabla (s) que aloja sus datos y pulsa tareas> generar secuencias de comandos. Serás llevado a un asistente como ves a continuación.

Simplemente pulse Siguiente si se muestra esta primera pantalla. Just hit Next if this first screen is displayed.

Seleccione la tabla (s) para el que desea generar el guión. Select the table(s) for which you would like to generate the script.

Seleccione cómo desea que se imprima su secuencia de comandos. Select how you want your script outputted. (I like the "new query window" option)
Me gusta la opción "nueva ventana de consulta".

pulsó el botón de Opciones avanzadas y seleccione datos sólo para Tipos de datos para la escritura Hit the Advanced button and select "Data only" for "Types of data to script"
Es posible que desee mirar por encima de las opciones para ver si hay algo más que desea modificar. Toca Ok cuando hayas terminado.

Hit Siguiente hasta llegar a esta pantalla. ¡Una vez que todo se ponga verde, tendrás tu script insert! Hit Next until you get to this screen. Once everything goes green you'll have your script!
Me gusta dejar esta pantalla abierta mientras pruebo mi script para ver si necesito hacer algún ajuste.

+0

Eso da todos los datos. En mi caso, resultará en 2 GB de datos para una determinada tabla. Quiero crear un conjunto de prueba más pequeño para una base de datos de prueba. – Roel

4

¡ATENCIÓN! COMO ES. Al comienzo de la secuencia de comandos puede ver ejemplos de cómo usar el procedimiento. Por supuesto, puede hacer que INSERT sea expresado si necesita o agrega DataTypes para su conversión requerida.

El resultado de la secuencia de comandos se concatena expresiones SELECT con UNION ALL. Tenga cuidado con la recopilación de su base de datos. No probé otra colación más de lo que necesito.

Para los campos Longitud largos Recomiendo usar [guardar el resultado como ..] en rejilla Resultado lugar Copiar. Debido a que puede obtener el guión cortado.

/* 
USE AdventureWorks2012 
GO 

IF OBJECT_ID('tempdb..#PersonTbl') IS NOT NULL 
    DROP TABLE #PersonTbl; 
GO 

SELECT TOP (100) 
     BusinessEntityID 
     , PersonType 
     , NameStyle 
     , Title 
     , FirstName 
     , MiddleName 
     , LastName 
     , Suffix 
     , EmailPromotion 
     , CONVERT(NVARCHAR(MAX), AdditionalContactInfo) AS [AdditionalContactInfo] 
     , CONVERT(NVARCHAR(MAX), Demographics) AS [Demographics] 
     , rowguid 
     , ModifiedDate 
INTO #PersonTbl 
FROM Person.Person 

EXEC dbo.p_GetTableAsSqlText 
    @table_name = N'#PersonTbl' 

EXEC dbo.p_GetTableAsSqlText 
    @table_name = N'Person' 
    , @table_owner = N'Person' 
*/ 
/*********************************************************************************************/ 
IF OBJECT_ID('dbo.p_GetTableAsSqlText', 'P') IS NOT NULL 
    DROP PROCEDURE dbo.p_GetTableAsSqlText 
GO 

CREATE PROCEDURE [dbo].[p_GetTableAsSqlText] 
    @table_name NVARCHAR(384) /*= 'Person'|'#Person'*/ 
    , @database_name NVARCHAR(384) = NULL /*= 'AdventureWorks2012'*/ 
    , @table_owner NVARCHAR(384) = NULL /*= 'Person'|'dbo'*/ 
/*WITH ENCRYPTION, RECOMPILE, EXECUTE AS CALLER|SELF|OWNER| 'user_name'*/ 
AS /*OLEKSANDR PAVLENKO p_GetTableAsSqlText ver.2016.10.11.1*/ 
    DECLARE @isTemporaryTable BIT = 0 

/*[DATABASE NAME]*/ 
    IF (PATINDEX('#%', @table_name) <> 0) 
     BEGIN 
      SELECT @database_name = DB_NAME(2) /*2 - 'tempdb'*/ 
        , @isTemporaryTable = 1 
     END 
    ELSE 
     SET @database_name = COALESCE(@database_name, DB_NAME()) 
/*END [DATABASE NAME]*/ 

/*[SCHEMA]*/ 
    SET @table_owner = COALESCE(@table_owner, SCHEMA_NAME()) 

    DECLARE @database_nameQuoted NVARCHAR(384) = QUOTENAME(@database_name, '') 
    DECLARE @table_ownerQuoted NVARCHAR(384) = QUOTENAME(@table_owner, '') 
    DECLARE @table_nameQuoted NVARCHAR(384) = QUOTENAME(@table_name, '') 

    DECLARE @full_table_name NVARCHAR(769) 
/*384 + 1 + 384*/ 
    DECLARE @table_id INT 

    SET @full_table_name = CONCAT(@database_nameQuoted, '.', @table_ownerQuoted, '.', @table_nameQuoted) 
    SET @table_id = OBJECT_ID(@full_table_name) 

    CREATE TABLE #ColumnTbl 
     (
     ColumnId INT 
     , ColName sysname COLLATE DATABASE_DEFAULT 
     , TypeId TINYINT 
     , TypeName sysname COLLATE DATABASE_DEFAULT 
     , TypeMaxLength INT 
     ) 

    DECLARE @dynSql NVARCHAR(MAX) = CONCAT(' 
INSERT INTO #ColumnTbl 
SELECT ISC.ORDINAL_POSITION AS [ColumnId] 
     , ISC.COLUMN_NAME AS [ColName] 
     , T.system_type_id AS [TypeId] 
     , ISC.DATA_TYPE AS [TypeName] 
     , ISC.CHARACTER_MAXIMUM_LENGTH AS [TypeMaxLength] 
FROM ', @database_name, '.INFORMATION_SCHEMA.COLUMNS AS [ISC] 
     INNER JOIN ', @database_name, '.sys.objects AS [O] ON ISC.TABLE_NAME = O.name 
     INNER JOIN ', @database_name, '.sys.types AS [T] ON ISC.DATA_TYPE = T.name 
WHERE ISC.TABLE_CATALOG = "', @database_name, '" 
     AND ISC.TABLE_SCHEMA = "', @table_owner, '" 
     AND O.object_id = ', @table_id) 

    IF (@isTemporaryTable = 0) 
     SET @dynSql = CONCAT(@dynSql, ' 
     AND ISC.TABLE_NAME = "', @table_name, '" 
') 
    ELSE 
     SET @dynSql = CONCAT(@dynSql, ' 
     AND ISC.TABLE_NAME LIKE "', @table_name, '%" 
') 

    SET @dynSql = REPLACE(@dynSql, '"', '''') 
    EXEC(@dynSql) 

    DECLARE @columnNamesSeparated NVARCHAR(MAX) = SUBSTRING((SELECT ', [' + C.ColName + ']' AS [text()] 
                  FROM #ColumnTbl AS [C] 
                  ORDER BY C.ColumnId 
                  FOR 
                  XML PATH('') 
                  ), 2, 4000) 
    --SELECT @columnNamesSeparated 

    DECLARE @columnNamesSeparatedWithTypes NVARCHAR(MAX) = SUBSTRING((SELECT '+", " + "CONVERT(' + (CASE C.TypeId 
                             WHEN 231 /*NVARCHAR*/ 
                             THEN CONCAT(C.TypeName, '(', 
                                (CASE WHEN C.TypeMaxLength = -1 THEN 'MAX' 
                                  ELSE CONVERT(NVARCHAR(MAX), C.TypeMaxLength) 
                                 END), ')') 
                             WHEN 239 /*NCHAR*/ 
                             THEN CONCAT(C.TypeName, '(', C.TypeMaxLength, ')') 
                             /*WHEN -1 /*XML*/ THEN '(MAX)'*/ 
                             ELSE C.TypeName 
                             END) + ', "+ COALESCE(' 
                       + (CASE C.TypeId 
                        WHEN 56 /*INT*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])' 
                        WHEN 40 /*DATE*/ 
                        THEN 'N"""" + CONVERT(NVARCHAR(MAX), [' + C.ColName + '], 101) + """"' 
                        WHEN 60 /*MONEY*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])' 
                        WHEN 61 /*DATETIME*/ 
                        THEN '"""" + CONVERT(NVARCHAR(MAX), [' + C.ColName + '], 21) + """"' 
                        WHEN 104 /*BIT*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])' 
                        WHEN 106 /*DECIMAL*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])' 
                        WHEN 127 /*BIGINT*/ THEN 'CONVERT(NVARCHAR(MAX), [' + C.ColName + '])' 
                        WHEN 189 /*TIMESTAMP*/ 
                        THEN 'N"""" + CONVERT(NVARCHAR(MAX), SUBSTRING([' + C.ColName 
                          + '], 1, 8000), 1) + """"' 
                        WHEN 241 /*XML*/ 
                        THEN '"""" + CONVERT(NVARCHAR(MAX), [' + C.ColName + ']) + """"' 
                        ELSE 'N"""" + CONVERT(NVARCHAR(MAX), REPLACE([' + C.ColName 
                          + '], """", """""")) + """"' 
                        END) + ' , "NULL") + ") AS [' + C.ColName + ']"' + CHAR(10) COLLATE DATABASE_DEFAULT AS [text()] 
                     FROM  #ColumnTbl AS [C] 
                     ORDER BY C.ColumnId 
                    FOR 
                     XML PATH('') 
                    ), 9, 100000) 

/*SELECT @columnNamesSeparated, @full_table_name*/ 
    DECLARE @dynSqlText NVARCHAR(MAX) = CONCAT(N' 
SELECT (CASE WHEN ROW_NUMBER() OVER (ORDER BY (SELECT 1)) = 1 THEN " 
-- INSERT INTO ', @full_table_name, ' 
--  (', @columnNamesSeparated, ' 
--  ) 
SELECT T.* --INTO #ResultTbl 
FROM (
" 
       ELSE "UNION ALL " 
       END) + "SELECT "+ ', @columnNamesSeparatedWithTypes, ' FROM ', @full_table_name) 
    SET @dynSqlText = CONCAT(@dynSqlText, ' UNION ALL SELECT ") AS [T] 

--SELECT * 
--FROM #ResultTbl 
"') 

    SET @dynSqlText = REPLACE(@dynSqlText, '"', '''') 
    --SELECT @dynSqlText AS [XML_F52E2B61-18A1-11d1-B105-00805F49916B] 
    EXEC(@dynSqlText) 

    IF OBJECT_ID('tempdb..#ColumnTbl') IS NOT NULL 
     DROP TABLE #ColumnTbl; 
GO 
Cuestiones relacionadas