247 votes

Comment générer un INSERT script pour une table SQL Server existante qui inclut toutes les lignes stockées ?

Je cherche un moyen de générer un script "Create and insert all rows" avec SQL Management Studio 2008 R2.

Je sais que je peux créer un "create table" script.

Je peux également créer un script "insert in", mais cela ne générera qu'une seule ligne avec des espaces réservés.

Existe-t-il un moyen de générer un script d'insertion qui contient toutes les lignes actuellement stockées ?

444voto

Thomas Rushton Points 1638

Oui, mais vous devrez l'exécuter au niveau de la base de données.

Cliquez avec le bouton droit de la souris sur la base de données dans SSMS, sélectionnez "Tasks", "Generate Scripts...". Au fur et à mesure, vous arriverez à une section "Scripting Options". Cliquez sur "Advanced", et dans la liste qui s'affiche, où il est indiqué "Types de données à script", vous avez la possibilité de sélectionner Data et/ou Schema.

Screen shot of Advanced Scripting Options

1 votes

Joli ! J'avais l'habitude de compter sur l'addin Tools Pack, comme gbn l'a suggéré, pour ce genre de tâche. Heureux de savoir que je n'en ai plus besoin.

34voto

Ce script génère des déclarations d'insertion de vos données existantes. Il s'agit d'une procédure stockée que vous devez exécuter une fois et qui est ensuite conçue sur mesure pour vous.

J'ai essayé de trouver ce genre de choses pendant un certain temps mais je n'étais pas satisfait des résultats, alors j'ai écrit cette procédure stockée.

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

Ici, Dbo est le schéma, test est le nom de l'onglet et name='neeraj' est la condition.

Voici la procédure stockée

/*
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)

0 votes

C'est un script très utile. Existe-t-il un moyen simple de modifier le format de l'heure, afin d'exporter les dates dans un format standard tel que "2014-03-31 23:55:41" ? Actuellement, j'obtiens des dates comme "Feb 10 2010 2:44PM".

0 votes

Il semble que vous deviez supprimer la partie SELECT FROM ainsi que les accolades carrées pour que le SPROC fonctionne.

0 votes

Le contrôle d'une colonne de calcul n'est pas présent. L'erreur se produit si votre table a une colonne de calcul.

20voto

gbn Points 197263

Oui, utilisez l'outil gratuit Addin SSMS Tools Pack qui possède une fonction astucieuse "Générer des instructions d'insertion à partir de jeux de résultats, de tables ou de bases de données".

Edit : comme mentionné dans un commentaire, ce n'est plus gratuit. Désolé.

11 votes

Plus de gratuité pour la version 2012.

6voto

nate Points 161

Il y a quelques versions différentes d'un INSERT data to scripter qui ont toutes des bugs avec la génération de données varchar et binaires qui contiennent des guillemets simples. Il y en a une qui fait parfaitement le travail et qui a de nombreuses options pour script les données vers. Si vous en cherchez un qui fait aussi MySQL, XML et CSV, celui de NMally fait le meilleur travail et vous pouvez le trouver à l'adresse suivante : SSMS Addin - Outil de scripting (INSERT à T-SQL) .

SSMS 2008 R2 Addin

-1voto

Andre Points 1

J'ai une colonne Identité. J'ai juste besoin de supprimer le nom et la valeur de cette colonne à chaque fois, alors je remplace cette ligne :

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

...avec cette ligne :

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 )

Cela permettra d'éviter les colonnes de contraintes au lieu des noms codés en dur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X