web-dev-qa-db-fra.com

Conversion des résultats de sélection en script d’insertion - SQL Server

J'ai SQL Server 2008, SQL Server Management Studio.

Je dois sélectionner des données à partir de Table1 dans la base de données1. Ensuite, je dois éditer certaines valeurs dans les résultats et insert values into Table1 dans database2. 

Ou laissez-moi le dire autrement. 

Comment puis-je convertir les données d'une table en insert script.

67
Captain Comic

SSMS Toolpack (qui est FREE comme dans beer) a une variété d’excellentes fonctionnalités - y compris générer des instructions INSERT à partir de tables.

Mise à jour: pour SQL Server Management Studio 2012 (et plus récente), SSMS Toolpack n'est plus libre, mais nécessite un faible coût de licence.

23
marc_s

Voici une autre méthode, qui peut s'avérer plus simple que d'installer des plugins ou des outils externes dans certaines situations:

  • Faites un select [whatever you need]INTO temp.table_namefrom [... etc ...].
  • Faites un clic droit sur la base de données dans l'explorateur d'objets => tâches => générer des scripts
  • Sélectionnez temp.table_name dans l'écran "Choisir les objets", cliquez sur Suivant.
  • Dans l'écran "Spécifiez comment les scripts doivent être enregistrés":
    • Cliquez sur Avancé, recherchez la propriété "Types de données dans un script", sélectionnez "Données uniquement", fermez les propriétés avancées.
    • Sélectionnez "Enregistrer dans une nouvelle fenêtre de requête" (sauf si vous avez des milliers d'enregistrements).
  • Cliquez sur Suivant, attendez que le travail soit terminé, observez les instructions INSERT résultantes dans une nouvelle fenêtre de requête.
  • Utilisez Rechercher et remplacer pour remplacer tous les [temp.table_name] par [your_table_name].
  • drop table [temp.table_name].
94
KT.

Méthode native

par exemple si vous avez une table 

Users(Id, name)

Tu peux le faire:

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

Dans SSMS:

  • Faites un clic droit sur la base de données> Tâches> Générer des scripts

  • Suivant

  • Sélectionnez "Sélectionner des objets de base de données spécifiques" et cochez la table de votre choix, puis cliquez sur Suivant.

  • Cliquez sur Advanced > dans la liste des options, faites défiler l'écran vers le bas, recherchez les "Types de données dans un script" et remplacez-le par "Données uniquement"> OK.

  • Sélectionnez "Enregistrer dans une nouvelle fenêtre de requête"> Suivant> Suivant> Terminer.

Les 180 lignes sont maintenant toutes écrites en 180 instructions d’insertion!

26
tember

1- Explication des scripts

A) La syntaxe pour insérer des données dans un tableau est la suivante

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) Obtenir les données ci-dessus à partir de fichiers existants table nous devons écrire le select requête de telle manière que la sortie sera sous la forme de comme ci-dessus des scripts

D) Ensuite, j'ai concaténé variable ci-dessus pour créer script final qui sera volonté générer un script d'insertion à l'exécution

E)

@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) Et enfin exécuté la requête ci-dessus EXECUTE(TEXT)

G) QUOTENAME() fonction est utilisée pour envelopper données de colonne à l'intérieur de la citation

H) ISNULL est utilisé parce que si une ligne a NULL données pour n'importe quelle colonne où la requête échoue et retourner NULL c'est pourquoi éviter que j'ai utilisé ISNULL 

I) Et créé le sp sp_generate_insertscripts pour même

1- Il suffit de mettre le nom de la table pour laquelle vous voulez insert script

2- Filtrez la condition si vous voulez des résultats spécifiques

----------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
8
Param Yadav

Il est possible de le faire via Visual Studio Explorateur d'objets SQL Server.

Vous pouvez cliquer sur "Afficher les données" dans le menu contextuel pour obtenir la table nécessaire, filtrer les résultats et enregistrer le résultat en tant que script.

8
BotanMan

À l'aide de Visual Studio, procédez comme suit: 

Créez un projet de type SQL Server -> Projet de base de données SQL Server

ouvrez l'explorateur SQL Server CTL- \, CTL-S 

ajoutez un serveur SQL en cliquant avec le bouton droit de la souris sur l’icône SQL SERVER. Selcet AJOUTER UN NOUVEAU SERVEUR

naviguez jusqu'à la table qui vous intéresse 

clic droit -> VIEW DATA

Cliquez sur la cellule en haut à gauche pour tout mettre en évidence (ctl-A ne semble pas fonctionner)

Clic droit -> SCript 

C'est fabuleux. J'ai essayé tout ce qui est énuméré ci-dessus au fil des ans. Je sais qu’il existe un outil permettant de faire cela et bien plus encore, je ne peux pas penser au nom de celui-ci. Mais c'est très cher. 

Bonne chance. Je viens de comprendre cela. Je ne l'ai pas testé de manière approfondie avec les champs de texte, etc., mais il semblerait que cela vous fasse perdre beaucoup de temps. 

Greg

8
greg

Créez une table séparée à l'aide de l'instruction into Par exemple

Sélectionnez * dans Test_123 dans [dbo]. [Employé] où Nom comme '% Test%'

Allez dans la base de données Cliquez avec le bouton droit de la souris sur la base de donnéesCliquez sur Générer le scriptSélectionnez votre tableSélectionnez l’option advanace et sélectionnez l’attribut "Données uniquement" Sélectionnez le fichier "ouvrir dans une nouvelle requête"

SQL va générer un script pour vous

3
KMR

Vous pouvez choisir l’option «Résultat dans le fichier» dans SSMS et exporter votre résultat sélectionné dans un fichier et apporter vos modifications dans le fichier de résultats. Vous pouvez enfin utiliser BCP - Bulk copy dans le tableau 1 de la base de données 2.

Je pense que pour l'insertion en bloc, vous devez convertir le fichier .rpt en fichier .csv

J'espère que ça va aider.

3
Pankaj Agarwal

C'est une solution plus polyvalente (qui peut faire un peu plus que la question) et qui peut être utilisée dans une fenêtre de requête sans avoir à créer un nouveau proc stocké - utile dans les bases de données de production, par exemple, où vous n'avez pas d'accès en écriture. .

Pour utiliser le code, veuillez modifier en fonction des commentaires en ligne expliquant son utilisation. Vous pouvez ensuite simplement exécuter cette requête dans une fenêtre de requête et les instructions INSERT dont vous avez besoin seront imprimées.

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
2
Neo

Vous pouvez utiliser une instruction INSERT INTO SELECT pour insérer les résultats d'une requête de sélection dans une table. http://www.w3schools.com/sql/sql_insert_into_select.asp

Exemple:

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

J'ai eu un problème similaire, mais j'avais besoin de pouvoir créer une instruction INSERT à partir d'une requête (avec des filtres, etc.) 

J'ai donc créé la procédure suivante:

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

Vous pouvez ensuite l'utiliser en écrivant le résultat de votre requête dans une table temporaire et en exécutant la procédure:

-- 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'

Remarque: Cette procédure convertit uniquement les valeurs en une chaîne, ce qui peut donner un aspect légèrement différent aux données. Avec DATETIME par exemple, les secondes seront perdues.

1
JollyBrackets

Vous pouvez utiliser des packages de services d'intégration de serveur SQL spécialement conçus pour l'opération Import/Export

VS a un paquet pour développer ces paquets si vous installez complètement Sql Server.

Services d'intégration dans Business Intelligence Development Studio

1
Jahan Zinedine

Je pense que c'est également possible avec les requêtes ad hoc Vous pouvez exporter le résultat dans un fichier Excel, puis importer ce fichier dans votre objet datatable ou l'utiliser tel quel, puis importer le fichier Excel dans la deuxième base de données ce lien cela peut vous aider beaucoup.

http://vscontrols.blogspot.com/2010/09/import-and-export-Excel-to-sql-server.html

1
JSJ

Vous pouvez utiliser ce Q2C.SSMSPlugin , qui est gratuit et open source. Vous pouvez cliquer avec le bouton droit de la souris et sélectionner "Exécuter Query To Command ... -> Query To Insert ...". Prendre plaisir)

0
Sergey Petrov

Si vous utilisez Oracle (ou configurez l'application sur SQL Server), Oracle SQL Developer le fait pour vous. choisissez "décharger" pour une table et suivez les options jusqu'à (décochez DDL si vous ne voulez pas que toutes les tables créent des commandes).

0
Liam

J'ai trouvé ceci SMSMS Boost addon, qui est gratuit et fait exactement cela, entre autres choses. Vous pouvez cliquer avec le bouton droit sur les résultats et sélectionner Données de script comme.

0
DAud

J'ai créé la procedure suivante:

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

Ensuite, vous pouvez l'utiliser de cette façon:

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;

Le résultat serait quelque chose comme ça:

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

Si vous voulez juste obtenir une plage de lignes, utilisez le paramètre @top comme suit:

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;
0
Sorack