web-dev-qa-db-fra.com

Générer un script d'insertion pour les enregistrements sélectionnés?

J'ai une table avec les données suivantes:

Pk_Id  ProductName           Fk_CompanyId       Price
------------------------------------------------------
1      AMX                   1                  10.00
2      ABC                   1                  11.00
3      APEX                  1                  12.00
4      AMX                   1                  10.00
5      ABC                   1                  11.00
6      APEX                  1                  12.00
7      AMX                   2                  10.00
8      ABC                   2                  11.00
9      APEX                  2                  12.00

Je souhaite générer un script d'insertion pour la migration d'enregistrements dont Fk_CompanyId est égal à 1.

Il existe une option de script d'insertion pour générer un script pour tous les enregistrements, mais je souhaite filtrer certains enregistrements afin de les migrer vers une autre base de données.

37
sudhAnsu63

Si vous utilisez SQL Management Studio, vous pouvez cliquer avec le bouton droit de la souris sur le nom de votre base de données, sélectionner Tâches> Importer/Exporter des données et suivre l’assistant.
L’une des étapes est appelée "Spécifier une copie ou une requête de table" où il existe une option pour écrire une requête afin de spécifier les données à transférer, afin que vous puissiez simplement spécifier la requête suivante:

select * from [Table] where Fk_CompanyId = 1
43
Tamir
SELECT 'INSERT SomeOtherDB.dbo.table(column1,column2,etc.)
  SELECT ' + CONVERT(VARCHAR(12), Pk_Id) + ','
       + '''' + REPLACE(ProductName, '''', '''''') + ''','
       + CONVERT(VARCHAR(12), Fk_CompanyId) + ','
       + CONVERT(VARCHAR(12), Price) + ';'
FROM dbo.unspecified_table_name
WHERE Fk_CompanyId = 1;
19
Aaron Bertrand
CREATE PROCEDURE sp_generate_insertscripts
(
    @TABLENAME VARCHAR(MAX),
    @FILTER_CONDITION VARCHAR(MAX)=''   -- where TableId = 5 or some value
)
AS
BEGIN

SET NOCOUNT ON

DECLARE @TABLE_NAME VARCHAR(MAX),
        @CSV_COLUMN VARCHAR(MAX),
        @QUOTED_DATA VARCHAR(MAX),
        @TEXT VARCHAR(MAX),
        @FILTER VARCHAR(MAX) 

SET @TABLE_NAME=@TABLENAME

SELECT @FILTER=@FILTER_CONDITION

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

--SELECT @CSV_COLUMN AS CSV_COLUMN,@QUOTED_DATA AS QUOTED_DATA,@TEXT TEXT

EXECUTE (@TEXT)

SET NOCOUNT OFF

END
14
Param Yadav

Si possible, utilisez Visual Studio. Les outils de données Microsoft SQL Server (SSDT) ​​apportent une fonctionnalité intégrée depuis la version de mars 2014:

  1. Ouvrir Visual Studio
  2. Ouvrir "Vue" → "Explorateur d'objets SQL Server"
  3. Ajouter une connexion à votre serveur
  4. Développer la base de données pertinente
  5. Développez le dossier "Tables"
  6. Clic droit sur la table correspondante
  7. Sélectionnez "Afficher les données" dans le menu contextuel.
  8. Dans la nouvelle fenêtre, l'affichage des données utilise la fonctionnalité "Trier et filtrer le jeu de données" de la barre d'outils pour appliquer votre filtre. Notez que cette fonctionnalité est limitée et que vous ne pouvez pas écrire de requêtes SQL explicites.
  9. Après avoir appliqué votre filtre et ne plus voir que les données souhaitées, cliquez sur "Script" ou "Script sur fichier" dans la barre d'outils.
  10. Voilà - Vous avez ici votre skript d'insertion pour vos données filtrées

Remarque: soyez prudent, la fenêtre "Afficher les données" est semblable à "Modifier les 200 premières lignes" de SSMS - vous pouvez modifier les données immédiatement.

(Testet avec Visual Studio 2015 avec Outils de données Microsoft SQL Server (SSDT) ​​version 14.0.60812.0 et Microsoft SQL Server 2012)

8
germanSharper

Vous pouvez créer une vue avec vos critères, puis exporter la vue?

5
bleeeah

Dans SSMS, exécutez votre requête SQL. Dans la fenêtre de résultat, sélectionnez toutes les cellules et copiez les valeurs. Goto ci-dessous site web et vous pouvez y coller les données copiées et générer des scripts SQL. Vous pouvez également enregistrer les résultats d'une requête de SSMS sous forme de fichier CSV et importer le fichier csv dans le site Web this .

http://www.convertcsv.com/csv-to-sql.htm

2
JC Raja

J'ai fini par le faire en 2 étapes. J'ai sélectionné les enregistrements que je veux dans une nouvelle table de la base de données, puis généré un script de données SQL uniquement dans SSMS. J'ai trouvé et remplacer sur le script généré et enlevé la table.

1
Steve Greene

Si vous utilisez Oracle SQL Developer, alors ce serait

select /*insert*/ * from TABLE_NAME where COLUMN_NAME = 'VALUE';

Exécuter ceci en tant que script

1
Varun Rao

J'ai créé le procedure suivant:

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 = 'myTable',
                        @where  = 'Fk_CompanyId = 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.MYTABLE
insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(1, 'AMX', 1, 10.00);
go

insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(2, 'ABC', 1, 11.00);
go

insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(3, 'APEX', 1, 12.00);
go

insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(4, 'AMX', 1, 10.00);
go

insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(5, 'ABC', 1, 11.00);
go

insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(6, 'APEX', 1, 12.00);
go

insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(7, 'AMX', 2, 10.00);
go

insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(8, 'ABC', 2, 11.00);
go

insert into dbo.myTable(Pk_Id, ProductName, Fk_CompanyId, Price)
values(9, 'APEX', 2, 12.00);
go

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

declare @insert varchar(max),
        @part   varchar(max),
        @start  int,
        @end    int;

set @start = 1;

exec tool.create_insert @schema = 'dbo',
                        @table = 'myTable',
                        @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;
1
Sorack