将 Select result 转换为 Insert script-SQLServer

我有 SQL Server 2008,SQLServerManagementStudio。

我需要从数据库1中的 Table1中选择数据。然后,我必须在结果中编辑一些值,在 database 2中编辑 insert values into Table1

换句话说。

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

254184 次浏览

SSMS 工具包(在啤酒中是 免费)具有各种优秀的特性-包括来自表的 生成 INSERT 语句

更新: 对于 SQLServerManagementStudio二零一二年(以及更新版本) ,SSMS Toolpack 不再是免费的,但需要适度的许可费用。

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

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

希望能有所帮助。

您可以使用专门为 进出口业务设计的 服务器集成服务包

如果您完全安装了 SqlServer,VS 有一个用于开发这些包的包。

商业智能开发工作室中的集成服务

原生方法 :

例如,如果你有表

Users(Id, name)

你可以这样做:

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

我认为它也可能与即席查询 您可以将结果导出到 excel 文件,然后将该文件导入到数据可表对象中,或者直接使用它,然后将 Excel 文件导入到第二个数据库中 看看这个链接 这对你很有帮助。

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

如果您正在使用 Oracle (或者将应用程序配置为 SQLServer) ,那么 OracleSQLDeveloper 将为您完成这项工作。选择“卸载”一个表,并按照选项通过(取消勾选 DDL,如果你不想所有的表创建的东西)。

使用 Visual Studio,执行以下操作

创建 SQLServer 类型的项目—— > SQLServer 数据库项目

打开 sql 服务器资源管理器 CTL-,CTL-S

右键单击 SQLSERVER 图标添加 SQLServer

导航到你感兴趣的桌子

右击-> 查看数据

单击左上角的单元格以突出显示所有内容(ctl-A 似乎不起作用)

右击-> 脚本

这太棒了。这些年来,我尝试了以上列出的所有方法。我知道有一个工具,这将做到这一点和更多,不能想到它的名称。但它非常昂贵。

祝你好运。我刚想明白。还没有广泛地测试它的 w/text 字段等,但它看起来可以为您提供很长的路要走。

格雷格

我发现这个 短信推进插件,这是免费的,正是这样做的其他事情。您可以右键单击结果并选择 Script data 作为。

可以通过 视觉工作室SQLServer 对象资源管理器进行操作。

您可以从上下文菜单中点击“查看数据”查看必要的表格、筛选结果并将结果保存为脚本。

在 SSMS 中:

  • 右键单击 database > Tasks > Generate Scripts

  • 下一个

  • 选择“选择特定的数据库对象”并检查要编写脚本的表,下一步

  • 单击选项列表中的 Advanced >,向下滚动到底部,查找“脚本数据类型”,并将其更改为“仅数据”> OK

  • 选择“ Save to new query window”> Next > Next > Finish

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

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)最后我连接了 上面的变量创建 最后的剧本是 Will 执行时生成插入脚本

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

最后执行上面的查询 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

可以使用 INSERT INTO SELECT语句将选择查询的结果插入到表中

例如:

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

您可以使用这个 Q2C.SSMSPlugin,它是免费和开源的。您可以右键单击并选择“ Execute Query To Command...-> Query To Insert...”。享用)

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

  • 做一个 select [whatever you need]INTO temp.table_namefrom [... etc ...]
  • 右键单击 Object Explorer = > Tasks = > Generate Scripts 中的数据库
  • 在“选择对象”屏幕中选择 temp.table_name,单击“下一步”。
  • 在“指定如何保存脚本”屏幕中:
    • 单击“高级”,找到“脚本数据类型”属性,选择“仅限数据”,关闭高级属性。
    • 选择“保存到新查询窗口”(除非有数千条记录)。
  • 单击 Next,等待作业完成,观察结果 INSERT语句出现在新的查询窗口中。
  • 使用查找和替换将所有 [temp.table_name]更改为 [your_table_name]
  • drop table [temp.table_name].

我也遇到过类似的问题,但是我需要能够从查询(使用过滤器等)创建 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 为例,秒数将会丢失。

使用 into 语句创建一个单独的表 比如说

从[ dbo ]中选择 * into Test _ 123. [ Employee ] ,其中名称为’% Test%’

进入数据库 右击数据库 点击生成脚本 选择您的桌子 选择 Advanced 选项并选择 Attribute“ Data Only” 选择文件“ open in new query”

Sql 将为您生成脚本

这是一个通用性更强的解决方案(可以比问题要求做的多一点) ,可以在查询窗口中使用,而不必创建新的存储过程——在生产数据库中非常有用,例如在没有写访问权限的情况下。

要使用该代码,请根据解释其用法的行内注释进行修改。然后可以在查询窗口中运行此查询,它将打印所需的 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

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