将select结果转换为插入脚本
我有SQL Server 2008,SQL Server Management Studio。
我需要从database1中的表1中select数据。 然后,我必须编辑结果中的一些值,并将值插入到数据库2中的表1中。
或者让我换一种方式。 如何将一个表中的数据转换为插入脚本。
SSMS工具包(在啤酒中是免费的 )具有各种强大的function – 包括从表生成INSERT语句 。
更新:对于SQL Server Management Studio 2012 (及更新版本),SSMS工具包不再免费,但需要适度的许可费用。
这里是另一种方法,在某些情况下比安装插件或外部工具更容易:
-
from [... etc ...]
select [whatever you need]
INTO temp.table_name
。 - 在Object Explorer中右键单击数据库=> Tasks => Generate Scripts
- 在“select对象”屏幕中select
temp.table_name
,然后单击下一步。 - 在“指定应如何保存脚本”屏幕中:
- 单击高级,find“脚本的数据types”属性,select“仅数据”,closures高级属性。
- select“保存到新的查询窗口”(除非你有成千上万的logging)。
- 单击下一步,等待作业完成,观察生成的
INSERT
语句出现在新的查询窗口中。 - 使用查找和replace将所有
[temp.table_name]
更改为[your_table_name]
。 -
drop table [temp.table_name]
。
原生方法 :
例如,如果你有桌子
Users(Id, name)
你可以这样做:
select 'insert into Table values(Id=' + Id + ', name=' + name + ')' from Users
在SSMS中:
-
右键单击数据库>任务>生成脚本
-
下一个
-
select“select特定的数据库对象”,并检查你想要脚本的表,下一步
-
在选项列表中单击
Advanced >
,向下滚动到底部,查找“脚本数据types”并将其更改为“仅数据”>确定 -
select“保存到新的查询窗口”>下一步>下一步>完成
所有180行现在写成180个插入语句!
使用visual studio,请执行以下操作
创build一个SQL Servertypes的项目 – > SQL Server数据库项目
打开sql server explorer CTL- \,CTL-S
通过右键单击SQL Server图标来添加一个SQL Server。 Selcet添加新服务器
向下导航到您感兴趣的表格
右键单击 – >查看数据
点击左上angular的单元格来突出显示所有内容(ctl-A似乎不起作用)
右键点击 – > SCript
这是神话般的。 我已经尝试了以上所列的所有内容。 我知道有一个工具可以做到这一点,还有更多,不能想到它的名字。 但它是非常昂贵的。
祝你好运。 我只是明白了这一点。 还没有广泛testing它/文本字段等,但它看起来像让你在路上漫漫长路。
格雷格
可以通过Visual Studio SQL Server对象资源pipe理器来完成。
您可以从上下文菜单中单击“查看数据”查看必要的表格,过滤结果并将结果保存为脚本。
您可以在SSMS中select“结果到文件”选项,并将select的结果导出到文件,并在结果文件中进行更改,最后使用BCP – 批量复制,您可以在数据库2的表1中插入。
我认为对于批量插入,你必须将.rpt文件转换为.csv文件
希望它会有所帮助。
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 -- ie column data in --quote i have used --below variable ----@QUOTED_DATA---
C)为了从现有的表中获得上述数据,我们必须以这样的方式编写select查询:输出将以上述脚本的forms
D)然后最后我已经连接上面的variables来创build最终的脚本,这将生成执行插入脚本
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
我)并创buildsp sp_generate_insertscripts相同
1-只要把你想插入脚本的表名称
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
您可以使用专门为导入和导出操作devise的Sql Server集成服务包 。
如果您完全安装Sql Server,VS有一个用于开发这些软件包的软件包。
商业智能开发工作室中的集成服务
我认为它也有可能与adhoc查询,你可以导出结果到Excel文件,然后将该文件导入到您的数据表对象或使用它,然后导入Excel文件到第二个数据库看看这个链接,这可以帮助你很多。
http://vscontrols.blogspot.com/2010/09/import-and-export-excel-to-sql-server.html
使用into语句创build一个单独的表格例如
从[dbo]中select*到Test_123。[Employee]其中名称如'%Test%'
转到数据库右键单击数据库单击生成脚本select您的表selectadvanace选项并select属性“仅数据”select文件“在新查询中打开”
Sql会为你生成脚本
如果您正在使用Oracle(或将应用程序configuration到SQL Server),那么Oracle SQL Developer将为您执行此操作。 select“卸载”的表,并按照选项(如果你不想要所有的表创build东西的话,不要使用DDL)。
我发现这个SMSMS增强插件,这是免费的,并做这其中的事情。 您可以右键单击结果并select脚本数据为。
您可以使用INTO INSERT SELECT
语句将select查询的结果插入到表中。 http://www.w3schools.com/sql/sql_insert_into_select.asp
例:
INSERT INTO Customers (CustomerName, Country) SELECT SupplierName, Country FROM Suppliers WHERE Country='Germany';
你可以使用这个免费且开源的Q2C.SSMSPlugin 。 您可以右键单击并select“执行查询命令… – >查询插入…”。 请享用)
我有一个类似的问题,但我需要能够从查询中创build一个INSERT语句(使用filter等)
所以我创build了以下程序:
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'
注意:此过程仅将值转换为可能导致数据看起来有点不同的string。 以DATETIME为例,秒数将会丢失。
这是一个更通用的解决scheme(可以做的比问题要求多一点),并且可以在查询窗口中使用,而不必创build新的存储过程 – 在生产数据库中有用,例如没有写权限。
要使用这些代码,请根据在线注释来修改它的用法。 然后,您可以在查询窗口中运行该查询,并打印您所需的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
我创build了以下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;