trucos teclas studio rapidos rapidas management lista español desde consultas comandos cero atajos aprender sql sql-server sql-server-2008 ssms

teclas - Conversión de Seleccionar resultados en secuencia de comandos Insertar-SQL Server



teclas rapidas sql server 2012 (18)

Tengo SQL Server 2008 , SQL Server Management Studio.

Necesito seleccionar datos de Table1 en database1. Luego, tengo que editar algunos valores en los resultados e insert values into Table1 en database2.

O déjame decirlo de otra manera.

¿Cómo puedo convertir los datos en una tabla en insert script ?


1- Explicación de guiones

A) La sintaxis para insertar datos en la tabla es la siguiente

Insert into table(col1,col2,col3,col4,col5) -- To achieve this part i --have used below variable ------@CSV_COLUMN------- values(Col1 data in quote, Col2..quote,..Col5..quote) -- To achieve this part -- i.e column data in --quote i have used --below variable ----@QUOTED_DATA---

C) Para obtener los datos anteriores de la tabla existente, debemos escribir la consulta de selección de tal manera que la salida esté en la forma de los scripts anteriores.

D) Entonces finalmente he concatenado la variable anterior para crear el script final que generará el script de inserción en la ejecución

MI)

@TEXT=''SELECT ''''INSERT INTO ''+@TABLE_NAME+''(''+@CSV_COLUMN+'')VALUES(''''''+''+''+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+''+''+'''''')''''''+'' Insert_Scripts FROM ''+@TABLE_NAME + @FILTER_CONDITION

F) Y finalmente ejecutó la consulta anterior EXECUTE(TEXT)

G) QUOTENAME() función QUOTENAME() se usa para ajustar los datos de la columna dentro de la cita

H) Se usa ISNULL porque si cualquier fila tiene datos NULL para cualquier columna, la consulta falla y devuelve NULL por eso, para evitar que haya usado ISNULL

I) Y creé sp sp_generate_insertscripts para el mismo

1- Simplemente ponga el nombre de la tabla para la cual desea insert script

2- Condición del filtro si quieres resultados específicos

----------Final Procedure To generate Script------ CREATE PROCEDURE sp_generate_insertscripts ( @TABLE_NAME VARCHAR(MAX), @FILTER_CONDITION VARCHAR(MAX)='''' ) AS BEGIN SET NOCOUNT ON DECLARE @CSV_COLUMN VARCHAR(MAX), @QUOTED_DATA VARCHAR(MAX), @TEXT VARCHAR(MAX) SELECT @CSV_COLUMN=STUFF ( ( SELECT '',[''+ NAME +'']'' FROM sys.all_columns WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND is_identity!=1 FOR XML PATH('''') ),1,1,'''' ) SELECT @QUOTED_DATA=STUFF ( ( SELECT '' ISNULL(QUOTENAME(''+NAME+'',''+QUOTENAME('''''''','''''''''''')+''),''+''''''NULL''''''+'')+'''',''''''+''+'' FROM sys.all_columns WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND is_identity!=1 FOR XML PATH('''') ),1,1,'''' ) SELECT @TEXT=''SELECT ''''INSERT INTO ''+@TABLE_NAME+''(''+@CSV_COLUMN+'')VALUES(''''''+''+''+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+''+''+'''''')''''''+'' Insert_Scripts FROM ''+@TABLE_NAME + @FILTER_CONDITION --SELECT @CSV_COLUMN AS CSV_COLUMN,@QUOTED_DATA AS QUOTED_DATA,@TEXT TEXT EXECUTE (@TEXT) SET NOCOUNT OFF END


Aquí hay otro método, que puede ser más fácil que instalar plugins o herramientas externas en algunas situaciones:

  • Haga una select [whatever you need] INTO temp.table_name from [... etc ...] .
  • Haga clic derecho en la base de datos en el Explorador de objetos => Tareas => Generar secuencias de comandos
  • Seleccione temp.table_name en la pantalla "Elegir objetos", haga clic en Siguiente.
  • En la pantalla "Especificar cómo se deben guardar los scripts":
    • Haga clic en Avanzado, busque la propiedad "Tipos de datos para la secuencia de comandos", seleccione "Solo datos", cierre las propiedades avanzadas.
    • Seleccione "Guardar en nueva ventana de consulta" (a menos que tenga miles de registros).
  • Haga clic en Siguiente, espere a que se complete el trabajo, observe que las INSERT resultantes aparecen en una nueva ventana de consulta.
  • Use Buscar y reemplazar para cambiar todo [temp.table_name] a [your_table_name] .
  • drop table [temp.table_name] .

Creé el siguiente procedure :

if object_id(''tool.create_insert'', ''P'') is null begin exec(''create procedure tool.create_insert as''); end; go alter procedure tool.create_insert(@schema varchar(200) = ''dbo'', @table varchar(200), @where varchar(max) = null, @top int = null, @insert varchar(max) output) as begin declare @insert_fields varchar(max), @select varchar(max), @error varchar(500), @query varchar(max); declare @values table(description varchar(max)); set nocount on; -- Get columns select @insert_fields = isnull(@insert_fields + '', '', '''') + c.name, @select = case type_name(c.system_type_id) when ''varchar'' then isnull(@select + '' + '''', '''' + '', '''') + '' isnull('''''''''''''''' + cast('' + c.name + '' as varchar) + '''''''''''''''', ''''null'''')'' when ''datetime'' then isnull(@select + '' + '''', '''' + '', '''') + '' isnull('''''''''''''''' + convert(varchar, '' + c.name + '', 121) + '''''''''''''''', ''''null'''')'' else isnull(@select + '' + '''', '''' + '', '''') + ''isnull(cast('' + c.name + '' as varchar), ''''null'''')'' end from sys.columns c with(nolock) inner join sys.tables t with(nolock) on t.object_id = c.object_id inner join sys.schemas s with(nolock) on s.schema_id = t.schema_id where s.name = @schema and t.name = @table; -- If there''s no columns... if @insert_fields is null or @select is null begin set @error = ''There''''s no '' + @schema + ''.'' + @table + '' inside the target database.''; raiserror(@error, 16, 1); return; end; set @insert_fields = ''insert into '' + @schema + ''.'' + @table + ''('' + @insert_fields + '')''; if isnull(@where, '''') <> '''' and charindex(''where'', ltrim(rtrim(@where))) < 1 begin set @where = ''where '' + @where; end else begin set @where = ''''; end; set @query = ''select '' + isnull(''top('' + cast(@top as varchar) + '')'', '''') + @select + '' from '' + @schema + ''.'' + @table + '' with (nolock) '' + @where; insert into @values(description) exec(@query); set @insert = isnull(@insert + char(10), '''') + ''--'' + upper(@schema + ''.'' + @table); select @insert = @insert + char(10) + @insert_fields + char(10) + ''values('' + v.description + '');'' + char(10) + ''go'' + char(10) from @values v where isnull(v.description, '''') <> ''''; end; go

Entonces puedes usarlo de esa manera:

declare @insert varchar(max), @part varchar(max), @start int, @end int; set @start = 1; exec tool.create_insert @schema = ''dbo'', @table = ''customer'', @where = ''id = 1'', @insert = @insert output; -- Print one line to avoid the maximum 8000 characters problem while len(@insert) > 0 begin set @end = charindex(char(10), @insert); if @end = 0 begin set @end = len(@insert) + 1; end; print substring(@insert, @start, @end - 1); set @insert = substring(@insert, @end + 1, len(@insert) - @end + 1); end;

La salida sería algo así:

--DBO.CUSTOMER insert into dbo.customer(id, name, type) values(1, ''CUSTOMER NAME'', ''F''); go

Si solo desea obtener un rango de filas, use el parámetro @top como sigue:

declare @insert varchar(max), @part varchar(max), @start int, @end int; set @start = 1; exec tool.create_insert @schema = ''dbo'', @table = ''customer'', @top = 100, @insert = @insert output; -- Print one line to avoid the maximum 8000 characters problem while len(@insert) > 0 begin set @end = charindex(char(10), @insert); if @end = 0 begin set @end = len(@insert) + 1; end; print substring(@insert, @start, @end - 1); set @insert = substring(@insert, @end + 1, len(@insert) - @end + 1); end;


Cree una tabla separada usando en la declaración Por ejemplo

Seleccione * en Prueba_123 desde [dbo]. [Empleado] donde Nombre como ''% Prueba%''

Vaya a la Base de Datos Haga clic con el botón derecho en la Base de Datos Haga clic en Generar Script Seleccione su tabla Seleccione la opción advanace y seleccione el atributo "Solo Datos" Seleccione el archivo "abrir en una nueva consulta"

Sql generará un script para ti



En SSMS:

  • Haga clic con el botón derecho en la base de datos> Tareas> Generar secuencias de comandos

  • Siguiente

  • Seleccione "Seleccionar objetos específicos de la base de datos" y verifique la tabla que desea generar, Next

  • Haga clic en Advanced > en la lista de opciones, desplácese hacia abajo hasta la parte inferior y busque los "Tipos de datos para secuencia de comandos" y cámbielo a "Solo datos"> Aceptar

  • Seleccione "Guardar en nueva ventana de consulta"> Siguiente> Siguiente> Finalizar

¡Las 180 filas ahora escritas como 180 inserciones!


Encontré este complemento SMSMS Boost , que es gratis y hace exactamente esto, entre otras cosas. Puede hacer clic con el botón derecho en los resultados y seleccionar Datos de secuencia de comandos como.


Es posible hacerlo a través de Visual Studio SQL Server Object Explorer.

Puede hacer clic en "Ver datos" en el menú contextual para ver la tabla necesaria, filtrar los resultados y guardar el resultado como secuencia de comandos.


Esta es una solución más versátil (que puede hacer un poco más de lo que la pregunta), y puede usarse en una ventana de consulta sin tener que crear un nuevo proceso almacenado, útil en bases de datos de producción, por ejemplo, donde no tiene acceso de escritura .

Para usar el código, modifíquelo de acuerdo con los comentarios en línea que explican su uso. A continuación, puede ejecutar esta consulta en una ventana de consulta e imprimirá las instrucciones INSERT que necesite.

SET NOCOUNT ON -- Set the ID you wish to filter on here DECLARE @id AS INT = 123 DECLARE @tables TABLE (Name NVARCHAR(128), IdField NVARCHAR(128), IdInsert BIT, Excluded NVARCHAR(128)) -- Add any tables you wish to generate INSERT statements for here. The fields are as thus: -- Name: Your table name -- IdField: The field on which to filter the dataset -- IdInsert: If the primary key field is to be included in the INSERT statement -- Excluded: Any fields you do not wish to include in the INSERT statement INSERT INTO @tables (Name, IdField, IdInsert, Excluded) VALUES (''MyTable1'', ''Id'', 0, ''Created,Modified'') INSERT INTO @tables (Name, IdField, IdInsert, Excluded) VALUES (''MyTable2'', ''Id'', 1, ''Created,Modified'') DECLARE @numberTypes TABLE (sysId TINYINT) -- This will ensure INT and BIT types are not surrounded with quotes in the -- resultant INSERT statement, but you may need to add more (from sys.types) INSERT @numberTypes(SysId) VALUES(56),(104) DECLARE @rows INT = (SELECT COUNT(*) FROM @tables) DECLARE @cnt INT = 1 DECLARE @results TABLE (Sql NVARCHAR(4000)) WHILE @cnt <= @rows BEGIN DECLARE @tablename AS NVARCHAR(128) DECLARE @idField AS NVARCHAR(128) DECLARE @idInsert AS BIT DECLARE @excluded AS NVARCHAR(128) SELECT @tablename = Name, @idField = IdField, @idInsert = IdInsert, @excluded = Excluded FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS RowId FROM @tables) t WHERE t.RowId = @cnt DECLARE @excludedFields TABLE (FieldName NVARCHAR(128)) DECLARE @xml AS XML = CAST((''<X>'' + REPLACE(@excluded, '','', ''</X><X>'') + ''</X>'') AS XML) INSERT INTO @excludedFields SELECT N.value(''.'', ''NVARCHAR(128)'') FROM @xml.nodes(''X'') AS T(N) DECLARE @setIdentity NVARCHAR(128) = ''SET IDENTITY_INSERT '' + @tablename DECLARE @execsql AS NVARCHAR(4000) = ''SELECT '''''' + CASE WHEN @idInsert = 1 THEN @setIdentity + '' ON'' + CHAR(13) ELSE '''' END + ''INSERT INTO '' + @tablename + '' ('' SELECT @execsql = @execsql + STUFF ( ( SELECT CASE WHEN NOT EXISTS(SELECT * FROM @excludedFields WHERE FieldName = name) THEN '', '' + name ELSE '''' END FROM sys.columns WHERE object_id = OBJECT_ID(''dbo.'' + @tablename) FOR XML PATH('''') ), 1, 2, '''' ) + '')'' + CHAR(13) + ''VALUES ('' + STUFF ( ( SELECT CASE WHEN NOT EXISTS(SELECT * FROM @excludedFields WHERE FieldName = name) THEN '''''', '''' + ISNULL('' + CASE WHEN EXISTS(SELECT * FROM @numberTypes WHERE SysId = system_type_id) THEN '''' ELSE '''''''''''''''''' + '' END + ''CAST('' + name + '' AS VARCHAR)'' + CASE WHEN EXISTS(SELECT * FROM @numberTypes WHERE SysId = system_type_id) THEN '''' ELSE '' + '''''''''''''''''' END + '', ''''NULL'''') + '' ELSE '''' END FROM sys.columns WHERE object_id = OBJECT_ID(''dbo.'' + @tablename) FOR XML PATH('''') ), 1, 3, '''' ) + '''''')'' + CASE WHEN @idInsert = 1 THEN CHAR(13) + @setIdentity + '' OFF'' ELSE '''' END + '''''' FROM '' + @tablename + '' WHERE '' + @idField + '' = '' + CAST(@id AS VARCHAR) INSERT @results EXEC (@execsql) DELETE @excludedFields SET @cnt = @cnt + 1 END DECLARE cur CURSOR FOR SELECT Sql FROM @results OPEN cur DECLARE @sql NVARCHAR(4000) FETCH NEXT FROM cur INTO @sql WHILE @@FETCH_STATUS = 0 BEGIN PRINT @sql FETCH NEXT FROM cur INTO @sql END CLOSE cur DEALLOCATE cur


Puede elegir la opción ''Resultado para archivo'' en SSMS y exportar su resultado de selección al archivo y hacer los cambios en el archivo de resultados y finalmente usar BCP - Copia masiva que puede insertar en la tabla 1 en la base de datos 2.

Creo que para la inserción masiva tienes que convertir el archivo .rpt al archivo .csv

Espero que ayude


Puede usar este Q2C.SSMSPlugin , que es de código abierto y gratuito. Puede hacer clic derecho y seleccionar "Ejecutar consulta al comando ... -> Consultar para insertar ...". Disfrutar)



Puede usar una INTO INSERT SELECT para insertar los resultados de una consulta de selección en una tabla. http://www.w3schools.com/sql/sql_insert_into_select.asp

Ejemplo:

INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers WHERE Country=''Germany'';


SSMS Toolpack (que es GRATUITO como en beer) tiene una variedad de excelentes características, incluida la generación de sentencias INSERT a partir de tablas.

Actualización: para SQL Server Management Studio 2012 (y más reciente), SSMS Toolpack ya no es gratuito, pero requiere una tarifa de licencia modesta.


Si está utilizando Oracle (o configura la aplicación en el servidor SQL), Oracle SQL Developer hace esto por usted. elija ''descargar'' para una tabla y siga las opciones hasta (desmarque DDL si no desea que toda la tabla cree cosas).


Tenía un problema similar, pero necesitaba poder crear una instrucción INSERT a partir de una consulta (con filtros, etc.)

Así que creé el siguiente procedimiento:

CREATE PROCEDURE dbo.ConvertQueryToInsert (@input NVARCHAR(max), @target NVARCHAR(max)) AS BEGIN DECLARE @fields NVARCHAR(max); DECLARE @select NVARCHAR(max); -- Get the defintion from sys.columns and assemble a string with the fields/transformations for the dynamic query SELECT @fields = COALESCE(@fields + '', '', '''') + ''['' + name +'']'', @select = COALESCE(@select + '', '', '''') + '''''''''''''' + ISNULL(CAST(['' + name + ''] AS NVARCHAR(max)), ''''NULL'''')+'''''''''''''' FROM tempdb.sys.columns WHERE [object_id] = OBJECT_ID(N''tempdb..''+@input); -- Run the a dynamic query with the fields from @select into a new temp table CREATE TABLE #ConvertQueryToInsertTemp (strings nvarchar(max)) DECLARE @stmt NVARCHAR(max) = ''INSERT INTO #ConvertQueryToInsertTemp SELECT ''''''+ @select + '''''' AS [strings] FROM ''+@input exec sp_executesql @stmt -- Output the final insert statement SELECT ''INSERT INTO '' + @target + '' ('' + @fields + '') VALUES ('' + REPLACE(strings, ''''''NULL'''''', ''NULL'') +'')'' FROM #ConvertQueryToInsertTemp -- Clean up temp tables DROP TABLE #ConvertQueryToInsertTemp SET @stmt = ''DROP TABLE '' + @input exec sp_executesql @stmt END

Luego puede usarlo escribiendo el resultado de su consulta en una tabla temporal y ejecutando el procedimiento:

-- Example table CREATE TABLE Dummy (Id INT, Comment NVARCHAR(50), TimeStamp DATETIME) INSERT INTO Dummy VALUES (1 , ''Foo'', GetDate()), (2, ''Bar'', GetDate()), (3, ''Foo Bar'', GetDate()) -- Run query and procedure SELECT * INTO #TempTableForConvert FROM Dummy WHERE Id < 3 EXEC dbo.ConvertQueryToInsert ''#TempTableForConvert'', ''dbo.Dummy''

Nota: Este procedimiento solo arroja los valores a una cadena que puede hacer que los datos se vean un poco diferentes. Con DATETIME, por ejemplo, los segundos se perderán.


Usando Visual Studio, haz lo siguiente

Cree un proyecto de tipo SQL Server -> Proyecto de Base de Datos SQL Server

abra el explorador de servidor sql CTL- /, CTL-S

agregue un servidor SQL haciendo clic derecho en el icono SQL SERVER. Selcet AGREGAR NUEVO SERVIDOR

navega hasta la tabla que te interesa

clic derecho -> VER DATOS

Haga clic en la celda superior izquierda para resaltar todo (ctl-A parece que no funciona)

Click derecho -> SCript

Esto es fabuloso. He intentado todo lo mencionado anteriormente a lo largo de los años. Sé que hay una herramienta que hará esto y mucho más, no puedo pensar en el nombre. Pero es muy caro.

Buena suerte. Me di cuenta de esto. No lo he probado extensamente con campos de texto, etc., pero parece que te lleva lejos en el camino.

Greg


Método nativo :

por ejemplo, si tienes una mesa

Users(Id, name)

Puedes hacerlo:

select ''insert into Table values(Id='' + Id + '', name='' + name + '')'' from Users