为选定的记录生成插入脚本?

时间:2012-07-19 12:16:43

标签: sql database sql-server-2008

我有一张包含以下数据的表格:

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

我想生成用于迁移Fk_CompanyId为1的记录的插入脚本。

有一个插入脚本选项可以为所有记录生成脚本,但我想过滤一些记录以迁移到另一个数据库。

11 个答案:

答案 0 :(得分:42)

如果您使用的是SQL Management Studio,则可以右键单击数据库名称并选择 任务>导入/导出数据并按照向导进行操作 其中一个步骤称为“指定表复制或查询”,其中有一个选项可以编写查询以指定要传输的数据,因此您只需指定以下查询:

select * from [Table] where Fk_CompanyId = 1

答案 1 :(得分:18)

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;

答案 2 :(得分:15)

$row

答案 3 :(得分:5)

您可以使用条件创建视图,然后导出视图吗?

答案 4 :(得分:4)

如果可能,请使用Visual Studio。自2014年3月发布以来,Microsoft SQL Server数据工具(SSDT)为此提供了内置功能:

  1. 打开Visual Studio
  2. 打开“查看”→“ SQL Server对象资源管理器”
  3. 添加到服务器的连接
  4. 扩展相关数据库
  5. 展开“表格”文件夹
  6. 右键单击相关表
  7. 从上下文菜单中选择“查看数据”
  8. 在新窗口中,使用“排序和过滤”来查看数据 工具栏上的“数据集”功能来应用您的过滤器。请注意,此功能是受限制的,您不能编写显式SQL查询。
  9. 应用过滤器后,仅看到所需的数据,请在工具栏中单击“脚本”或“脚本到文件”
  10. Voilà-在这里,您可以插入过滤数据的skript

注意:请注意,“查看数据”窗口就像SSMS“编辑前200行”一样-您可以立即编辑数据

(带有Visual Studio 2015和Microsoft SQL Server数据工具(SSDT)版本14.0.60812.0和Microsoft SQL Server 2012的Testet)

答案 5 :(得分:2)

在SSMS中执行您的SQL查询。从结果窗口中选择所有单元格并复制值。转到below website,然后您可以粘贴复制的数据并生成sql脚本。您还可以将SSMS的查询结果保存为CSV文件,并在this网站中导入csv文件。

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

答案 6 :(得分:1)

如果您使用的是Oracle SQL Developer,那么它将是

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

将其作为脚本运行

答案 7 :(得分:1)

我最终分两步完成了这项工作。将我想要的记录选入数据库中的新表,然后在SSMS中生成仅SQL数据脚本。我确实找到并替换了生成的脚本并删除了表。

答案 8 :(得分:1)

我创建了以下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

然后你可以这样使用它:

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;

输出将是这样的:

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

如果您只想获得一系列行,请使用@top参数,如下所示:

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;

答案 9 :(得分:1)

使用 DBeaver 客户端(支持 SQL Server),您可以对所需的记录执行 SELECT 查询,然后选择结果行,右键单击并复制为 SQL,您的剪贴板中就会有 INSERT 语句:

enter image description here

答案 10 :(得分:0)

如果您使用的是 MySql 和 MySql 工作台。 这是一个不错的选择。

  1. 编写您的选择查询并执行它
  2. 您会看到“导出”按钮
  3. List item
  4. 点击它并给出一个文件名,在“另存为类型”中你会看到“SQL插入语句”

这会给你插入语句

enter image description here