234 votos

¿Cómo generar una secuencia de comandos INSERT para una tabla de SQL Server existente que incluye todas las filas almacenadas?

Estoy buscando una manera de generar una secuencia de comandos "Crear e insertar todas las filas" con SQL Management Studio 2008 R2.

Sé que puedo crear un guión "create table".

También puedo crear un "inserto en" guión, pero que sólo generará una única fila con marcadores de posición.

¿Hay una manera de generar un script de inserción que contiene todas las filas almacenadas actualmente?

416voto

Thomas Rushton Puntos 1638

Sí, pero usted tendrá que ejecutarlo en el nivel de base de datos.

Haga clic derecho en la base de datos en SSMS, seleccione "Tareas", "generar scripts ...". A medida que trabaja a través de, usted llegará a una sección de "Opciones Scripting". Haga clic en "Opciones avanzadas", y en la lista que aparece, donde dice "Tipos de datos a la escritura", tienes la opción de seleccionar los datos y / o esquema.

Captura de pantalla de opciones avanzadas de scripting

30voto

Este script genera instrucciones de inserción de los datos existentes. Se trata de un procedimiento almacenado que tiene que ejecutar una vez y entonces es hecho a medida para usted.

Traté de encontrar este tipo de cosas por un tiempo pero no estaba satisfecho con los resultados, así que escribí este procedimiento almacenado.

 Example (1) Exec [dbo].[INS]  'Dbo.test where 1=1'

Here Dbo is schema and test is tablename and 1=1 is condition
             (2) Exec [dbo].[INS]  'Dbo.test where name =''neeraj''' * for string
 

Aquí Dbo es esquema y prueba se nombtabla y nombre = 'neeraj' está condición.

Aquí está el procedimiento almacenado

 /*
Authore : neeraj prasad sharma (please dont remove this :))
Example (1) Exec [dbo].[INS]  'Dbo.test where 1=1'
        (2) Exec [dbo].[INS]  'Dbo.test where name =''neeraj''' * for string

here Dbo is schema and test is tablename and 1=1 is condition

*/


CREATE procedure  [dbo].[INS]                              
(                                                          
   @Query  Varchar(MAX)                                                          
)                              

AS                              

       Set nocount ON                  

DEclare @WithStrINdex as INT                            
DEclare @WhereStrINdex as INT                            
DEclare @INDExtouse as INT                            

Declare @SchemaAndTAble VArchar(270)                            
Declare @Schema_name  varchar(30)                            
Declare @Table_name  varchar(240)                            
declare @Condition  Varchar(MAX)                             

SET @WithStrINdex=0                            

SELECT @WithStrINdex=CHARINDEX('With',@Query )                            
, @WhereStrINdex=CHARINDEX('WHERE', @Query)                            

IF(@WithStrINdex!=0)                            
Select @INDExtouse=@WithStrINdex                            
ELSE                            
Select @INDExtouse=@WhereStrINdex                            

Select @SchemaAndTAble=Left (@Query,@INDExtouse-1)                                                     
select @SchemaAndTAble=Ltrim (Rtrim( @SchemaAndTAble))                            

Select @Schema_name= Left (@SchemaAndTAble, CharIndex('.',@SchemaAndTAble )-1)                            
,      @Table_name = SUBSTRING(  @SchemaAndTAble , CharIndex('.',@SchemaAndTAble )+1,LEN(@SchemaAndTAble) )                            

,      @CONDITION=SUBSTRING(@Query,@WhereStrINdex+6,LEN(@Query))--27+6                            


Declare   @COLUMNS  table (Row_number SmallINT , Column_Name VArchar(Max) )                              
Declare @CONDITIONS as varchar(MAX)                              
Declare @Total_Rows as SmallINT                              
Declare @Counter as SmallINT              

declare @ComaCol as varchar(max)            
select @ComaCol=''                   

Set @Counter=1                              
set @CONDITIONS=''                              

INsert INTO @COLUMNS                              
Select  Row_number()Over (Order by ORDINAL_POSITION ) [Count] ,Column_Name FRom INformation_schema.columns Where Table_schema=@Schema_name                              
And table_name=@Table_name         
and Column_Name not in ('SyncDestination','PendingSyncDestination' ,'SkuID','SaleCreditedto')                  

select @Total_Rows= Count(1) FRom  @COLUMNS                              

             Select @Table_name= '['+@Table_name+']'                      

             Select @Schema_name='['+@Schema_name+']'                      

While (@Counter<=@Total_Rows )                              
begin                               
--PRINT @Counter                              

    select @ComaCol= @ComaCol+'['+Column_Name+'],'            
    FROM @COLUMNS                              
Where [Row_number]=@Counter                          

select @CONDITIONS=@CONDITIONS+ ' +Case When ['+Column_Name+'] is null then ''Null'' Else ''''''''+                              

 Replace( Convert(varchar(Max),['+Column_Name+']  ) ,'''''''',''''  )                              

  +'''''''' end+'+''','''                              

FROM @COLUMNS                              
Where [Row_number]=@Counter                              

SET @Counter=@Counter+1                              

End                              

select @CONDITIONS=Right(@CONDITIONS,LEN(@CONDITIONS)-2)                              

select @CONDITIONS=LEFT(@CONDITIONS,LEN(@CONDITIONS)-4)              
select @ComaCol= substring (@ComaCol,0,  len(@ComaCol) )                            

select @CONDITIONS= '''INSERT INTO '+@Schema_name+'.'+@Table_name+ '('+@ComaCol+')' +' Values( '+'''' + '+'+@CONDITIONS                              

select @CONDITIONS=@CONDITIONS+'+'+ ''')'''                              

Select @CONDITIONS= 'Select  '+@CONDITIONS +'FRom  ' +@Schema_name+'.'+@Table_name+' With(NOLOCK) ' + ' Where '+@Condition                              
print(@CONDITIONS)                              
Exec(@CONDITIONS)  
 

17voto

gbn Puntos 197263

Sí, utilice el gratuitos SSMS paquete de herramientas de complemento que tiene una ingeniosa característica "Generar instrucciones de inserción de conjuntos de resultados, tablas o bases de datos"

Editar: como se mencionó en un comentario, esto ya no es libre. Lo siento.

6voto

nate Puntos 161

Hay un par de versiones diferentes de una INSERCIÓN de datos para scripter que todos tienen errores con la generación de datos varchar y binario que contiene comillas simples. Hay uno que hace el trabajo a la perfección y tiene muchas opciones de datos de secuencias de comandos. Si usted está buscando para uno que también hace de MySQL, XML y CSV, el uno por NMally hace el mejor trabajo y lo puedes encontrar en: SSMS Addin - herramienta de secuencias de comandos (INSERCIÓN de T-SQL).

SSMS 2008 R2 Addin

-1voto

Andre Puntos 1

Tengo una columna de identidad. Sólo tengo que quitar ese nombre de la columna y el valor cada vez, entonces puedo reemplazar esta línea:

and Column_Name not in ('SyncDestination','PendingSyncDestination' ,'SkuID','SaleCreditedto')

... Con esta línea:

and Column_Name not in ( SELECT t.COLUMN_NAME FROM INformation_schema.CONSTRAINT_COLUMN_USAGE t WHERE t.TABLE_NAME = @Table_name and t.TABLE_SCHEMA = @Schema_name )

Esto evitará que las columnas de restricción en lugar de nombres cifrados duros.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X