将选择结果转换为插入脚本 - SQL Server

时间:2010-12-24 12:56:10

标签: sql sql-server sql-server-2008 ssms

我有SQL Server 2008,SQL Server Management Studio。

我需要从database1中的Table1中选择数据。然后我必须编辑结果中的一些值和database2中的insert values into Table1

或者让我用其他方式。

如何将一个表格中的数据转换为insert script

18 个答案:

答案 0 :(得分:104)

这是另一种方法,在某些情况下可能比安装插件或外部工具更容易:

  • 执行select [whatever you need] INTO temp.table_name from [... etc ...]
  • 在对象资源管理器中右键单击数据库=>任务=>生成脚本
  • 在"选择对象"中选择temp.table_name;屏幕,单击“下一步”。
  • 在"指定如何保​​存脚本"屏幕:
    • 点击高级,找到"数据类型到脚本"属性,选择"仅限数据",关闭高级属性。
    • 选择"保存到新查询窗口" (除非你有数千条记录)。
  • 单击“下一步”,等待作业完成,观察生成的INSERT语句是否出现在新的查询窗口中。
  • 使用Find&替换以将所有[temp.table_name]更改为[your_table_name]
  • drop table [temp.table_name]

答案 1 :(得分:34)

原生方法

例如,如果你有表

Users(Id, name)

你可以这样做:

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

答案 2 :(得分:29)

在SSMS中:

  • 右键单击数据库>任务>生成脚本

  • 下一步

  • 选择“选择特定数据库对象”并选中要编写脚本的表,然后单击

  • 点击选项列表中的gen child_marr = 0 forvalues y = 79/99 { local yr = 1900 + `y' replace child_marr = child_marr + 1 if (ch_yob <= `yr') & (marr`y' == 1) & (`yr' < (ch_yob + 18)) } ,向下滚动到底部,查找“脚本数据类型”并将其更改为“仅限数据”&gt;确定

  • 选择“保存到新查询窗口”&gt;下一个&gt;下一个&gt;完成

现在所有180行都写成180个插入语句!

答案 3 :(得分:25)

SSMS Toolpack(啤酒中免费)具有多种强大功能 - 包括表格中的generating INSERT statements

更新对于SQL Server Management Studio 2012 (及更新版本),SSMS Toolpack不再免费,但需要适当的许可费用。

答案 4 :(得分:12)

1-脚本说明

A)在表格中插入数据的语法如下

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)从现有数据中获取上述数据   表我们要编写选择   以这种方式查询输出   将采用上述脚本的形式

D)然后最后我有了连接   以上变量来创建   最终的剧本将是   在执行时生成插入脚本

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)最后执行上述查询EXECUTE(TEXT)

G)QUOTENAME()函数用于包装   报价中的列数据

H)ISNULL被使用,因为如果任何行有NULL   查询失败的任何列的数据   并返回NULL这就是为什么要避免   我使用了ISNULL

I)并创建了sp sp_generate_insertscripts   为了相同

1-只需输入您想要的表名insert script

2-如果您想要特定结果,请过滤条件

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

答案 5 :(得分:8)

使用visual studio,执行以下操作

创建SQL Server类型的项目 - &gt; SQL Server数据库项目

打开sql server explorer CTL- \,CTL-S

右键单击SQL SERVER图标添加SQL Server。 Selcet添加新服务器

向下导航到您感兴趣的表格

右键单击 - &gt;查看数据

单击左上角的单元格以突出显示所有内容(ctl-A似乎无法正常工作)

右键单击 - &gt; SCript

这太棒了。多年来我一直在尝试上面列出的所有内容。我知道有一个工具可以做到这一点以及更多,不能想到它的名称。但它非常昂贵。

祝你好运。我刚想通了。没有广泛地测试它与文本字段等,但它看起来它会让你在很长一段路上。

格雷格

答案 6 :(得分:8)

可以通过 Visual Studio SQL Server对象资源管理器来完成。

您可以从上下文菜单中单击“查看数据”以获取必要的表格,过滤结果并将结果保存为脚本。

答案 7 :(得分:4)

使用into语句创建单独的表 例如

从[dbo]中选择*进入Test_123。[员工]其中名称如&#39;%Test%&#39;

转到数据库 右键单击数据库 单击“生成脚本” 选择你的桌子 选择advanace选项并选择属性&#34;仅数据&#34; 选择文件&#34;在新查询中打开&#34;

Sql将为您生成脚本

答案 8 :(得分:3)

您可以在SSMS中选择“结果到文件”选项并将选择结果导出到文件并在结果文件中进行更改,最后使用BCP - 批量复制,您可以在数据库2的表1中插入。

我认为对于批量插入,您必须将.rpt文件转换为.csv文件

希望它会有所帮助。

答案 9 :(得分:2)

我遇到了类似的问题,但我需要能够从查询中创建INSERT语句(使用过滤器等)

所以我创建了以下程序:

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

然后,您可以通过将查询的输出写入临时表并运行过程来使用它:

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

注意: 此过程仅将值强制转换为字符串,这可能导致数据看起来有点不同。以DATETIME为例,秒将丢失。

答案 10 :(得分:2)

这是一个更通用的解决方案(可以比问题要多做一点),并且可以在查询窗口中使用而无需创建新的存储过程 - 在生产数据库中很有用,例如你不在; t具有写访问权。

要使用该代码,请根据解释其用法的在线注释进行修改。然后,您可以在查询窗口中运行此查询,它将打印您需要的INSERT语句。

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

答案 11 :(得分:1)

您可以使用INSERT INTO SELECT语句将选择查询的结果插入表中。 http://www.w3schools.com/sql/sql_insert_into_select.asp

示例:

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

答案 12 :(得分:1)

我认为使用adhoc查询也是可能的 您可以将结果导出到excel文件,然后将该文件导入数据表对象或按原样使用,然后将excel文件导入第二个数据库 看看这个链接 这可以帮到你很多。

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

答案 13 :(得分:1)

您可以使用专为导入和导出操作设计的 Sql Server集成服务包

如果完全安装Sql Server,VS有一个用于开发这些软件包的软件包。

Integration Services in Business Intelligence Development Studio

答案 14 :(得分:0)

我找到了这个SMSMS Boost插件,它是免费的,并且正是这样做的。您可以右键单击结果,然后选择脚本数据为。

答案 15 :(得分:0)

如果您正在使用Oracle(或将应用程序配置到SQL Server),那么Oracle SQL Developer会为您执行此操作。为表选择'unload'并按照选项进行操作(如果你不希望所有的表都创建东西,请取消勾选DDL。)

答案 16 :(得分:0)

您可以使用此Q2C.SSMSPlugin,这是免费的开源软件。您可以右键单击并选择&#34;执行查询命令... - &gt;查询要插入...&#34;。享)

答案 17 :(得分:0)

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

输出将是这样的:

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

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

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;