国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

將表里的數(shù)據(jù)批量生成INSERT語句的存儲過程 增強版

2024-08-31 01:03:35
字體:
供稿:網(wǎng)友
這篇文章主要介紹了將表里的數(shù)據(jù)批量生成INSERT語句的存儲過程 增強版的相關(guān)資料,需要的朋友可以參考下
 

有時候,我們需要將某個表里的數(shù)據(jù)全部或者根據(jù)查詢條件導出來,遷移到另一個相同結(jié)構(gòu)的庫中

目前SQL Server里面是沒有相關(guān)的工具根據(jù)查詢條件來生成INSERT語句的,只有借助第三方工具(third party tools)

這種腳本網(wǎng)上也有很多,但是網(wǎng)上的腳本還是欠缺一些規(guī)范和功能,例如:我只想導出特定查詢條件的數(shù)據(jù),網(wǎng)上的腳本都是導出全表數(shù)據(jù)

如果表很大,對性能會有很大影響

這里有一個存儲過程(適用于SQLServer2005 或以上版本)

-- Author: <樺仔>-- Blog: <http://www.cnblogs.com/lyhabc/>-- Create date: <//>-- Description: <根據(jù)查詢條件導出表數(shù)據(jù)的insert腳本>-- =============================================CREATE PROCEDURE InsertGenerator(@tableName NVARCHAR(MAX),@whereClause NVARCHAR(MAX))AS --Then it includes a cursor to fetch column specific information (column name and the data type thereof) --from information_schema.columns pseudo entity and loop through for building the INSERT and VALUES clauses --of an INSERT DML statement.DECLARE @string NVARCHAR(MAX) --for storing the first half of INSERT statementDECLARE @stringData NVARCHAR(MAX) --for storing the data (VALUES) related statementDECLARE @dataType NVARCHAR(MAX) --data types returned for respective columnsDECLARE @schemaName NVARCHAR(MAX) --schema name returned from sys.schemasDECLARE @schemaNameCount int--shema countDECLARE @QueryString NVARCHAR(MAX) -- provide for the whole query, set @QueryString=' '--如果有多個schema,選擇其中一個schemaSELECT @schemaNameCount=COUNT(*)FROM sys.tables tINNER JOIN sys.schemas s ON t.schema_id = s.schema_idWHERE t.name = @tableNameWHILE(@schemaNameCount>)BEGIN--如果有多個schema,依次指定select @schemaName = name from (SELECT ROW_NUMBER() over(order by s.schema_id) RowID,s.nameFROM sys.tables tINNER JOIN sys.schemas s ON t.schema_id = s.schema_idWHERE t.name = @tableName) as vwhere RowID=@schemaNameCount--Declare a cursor to retrieve column specific information --for the specified tableDECLARE cursCol CURSOR FAST_FORWARDFORSELECT column_name ,data_typeFROM information_schema.columnsWHERE table_name = @tableNameAND table_schema = @schemaNameOPEN cursColSET @string = 'INSERT INTO [' + @schemaName + '].[' + @tableName + ']('SET @stringData = ''DECLARE @colName NVARCHAR()FETCH NEXT FROM cursCol INTO @colName, @dataTypePRINT @schemaNamePRINT @colNameIF @@fetch_status <> BEGINPRINT 'Table ' + @tableName + ' not found, processing skipped.'CLOSE curscolDEALLOCATE curscolRETURNENDWHILE @@FETCH_STATUS = BEGINIF @dataType IN ( 'varchar', 'char', 'nchar', 'nvarchar' )BEGINSET @stringData = @stringData + '''''''''+isnull(' + @colName + ','''')+'''''',''+'ENDELSEIF @dataType IN ( 'text', 'ntext' ) --if the datatype --is text or something else BEGINSET @stringData = @stringData + '''''''''+isnull(cast(' + @colName + ' as nvarchar(max)),'''')+'''''',''+'ENDELSEIF @dataType = 'money' --because money doesn't get converted --from varchar implicitlyBEGINSET @stringData = @stringData+ '''convert(money,''''''+isnull(cast(' + @colName+ ' as nvarchar(max)),''.'')+''''''),''+'ENDELSEIF @dataType = 'datetime'BEGINSET @stringData = @stringData+ '''convert(datetime,''''''+isnull(cast(' + @colName + ' as nvarchar(max)),'''')+''''''),''+'ENDELSEIF @dataType = 'image'BEGINSET @stringData = @stringData + '''''''''+isnull(cast(convert(varbinary,' + @colName + ') as varchar()),'''')+'''''',''+'ENDELSE --presuming the data type is int,bit,numeric,decimal BEGINSET @stringData = @stringData + '''''''''+isnull(cast(' + @colName + ' as nvarchar(max)),'''')+'''''',''+'ENDSET @string = @string + '[' + @colName + ']' + ','FETCH NEXT FROM cursCol INTO @colName, @dataTypeEND--After both of the clauses are built, the VALUES clause contains a trailing comma which needs to be replaced with a single quote. The prefixed clause will only face removal of the trailing comma.DECLARE @Query NVARCHAR(MAX) -- provide for the whole query, -- you may increase the sizePRINT @whereClauseIF ( @whereClause IS NOT NULLAND @whereClause <> '')BEGIN SET @query = 'SELECT ''' + SUBSTRING(@string, , LEN(@string))+ ') VALUES(''+ ' + SUBSTRING(@stringData, ,LEN(@stringData) - )+ '''+'')'' FROM ' +@schemaName+'.'+ @tableName + ' WHERE ' + @whereClausePRINT @query-- EXEC sp_executesql @query --load and run the built query--Eventually, close and de-allocate the cursor created for columns information.ENDELSEBEGIN SET @query = 'SELECT ''' + SUBSTRING(@string, , LEN(@string))+ ') VALUES(''+ ' + SUBSTRING(@stringData, ,LEN(@stringData) - )+ '''+'')'' FROM ' + @schemaName+'.'+ @tableNameENDCLOSE cursColDEALLOCATE cursColSET @schemaNameCount=@schemaNameCount-IF(@schemaNameCount=)BEGINSET @QueryString=@QueryString+@queryENDELSEBEGINSET @QueryString=@QueryString+@query+' UNION ALL 'ENDPRINT convert(varchar(max),@schemaNameCount)+'---'+@QueryStringENDEXEC sp_executesql @QueryString --load and run the built query--Eventually, close and de-allocate the cursor created for columns information. 

這里要聲明一下,如果你有多個schema,并且每個schema下面都有同一張表,那么腳本只會生成其中一個schema下面的表insert腳本

比如我現(xiàn)在有三個schema,下面都有customer這個表

CREATE TABLE dbo.[customer](city int,region int)CREATE SCHEMA testCREATE TABLE test.[customer](city int,region int)CREATE SCHEMA test1CREATE TABLE test1.[customer](city int,region int) 

在執(zhí)行腳本的時候他只會生成dbo這個schema下面的表insert腳本

INSERT INTO [dbo].[customer]([city],[region]) VALUES('1','2') 

這個腳本有一個缺陷

無論你的表的字段是什麼數(shù)據(jù)類型,導出來的時候只能是字符

表結(jié)構(gòu)

CREATE TABLE [dbo].[customer](city int,region int) 

導出來的insert腳本

INSERT INTO [dbo].[customer]([city],[region]) VALUES('1','2') 

我這里演示一下怎麼用

有兩種方式

1、導全表數(shù)據(jù)

InsertGenerator 'customer', null 

InsertGenerator 'customer', ' ' 

將表里的數(shù)據(jù)批量生成INSERT語句的存儲過程 增強版

2、根據(jù)查詢條件導數(shù)據(jù)

InsertGenerator 'customer', 'city=3' 

或者

InsertGenerator 'customer', 'city=3 and region=8' 

將表里的數(shù)據(jù)批量生成INSERT語句的存儲過程 增強版

點擊一下,選擇全部

將表里的數(shù)據(jù)批量生成INSERT語句的存儲過程 增強版

然后復(fù)制

將表里的數(shù)據(jù)批量生成INSERT語句的存儲過程 增強版

新建一個查詢窗口,然后粘貼

將表里的數(shù)據(jù)批量生成INSERT語句的存儲過程 增強版

其實SQLServer的技巧有很多

最后,大家可以看一下代碼,非常簡單,如果要支持SQLServer2000,只要改一下代碼就可以了

補充:創(chuàng)建一張測試表

CREATE TABLE testinsert (id INT,name VARCHAR(100),cash MONEY,dtime DATETIME)INSERT INTO [dbo].[testinsert]( [id], [name], [cash], [dtime] )VALUES ( 1, -- id - int'nihao', -- name - varchar(100)8.8, -- cash - moneyGETDATE() -- dtime - datetime)SELECT * FROM [dbo].[testinsert] 

測試

InsertGenerator 'testinsert' ,''InsertGenerator 'testinsert' ,'name=''nihao'''InsertGenerator 'testinsert' ,'name=''nihao'' and cash=8.8' 

datetime類型會有一些問題

生成的結(jié)果會自動幫你轉(zhuǎn)換

INSERT INTO [dbo].[testinsert]([id],[name],[cash],[dtime]) VALUES('1','nihao',convert(money,'8.80'),convert(datetime,'02 8 2015 5:17PM')) 

--------------------------------------------------------------------------------

群里的人共享的另一個腳本

IF OBJECT_ID('spGenInsertSQL','P') IS NOT NULL DROP PROC spGenInsertSQLGOCREATE proc spGenInsertSQL (@tablename varchar(256),@number BIGINT,@whereClause NVARCHAR(MAX))asbegindeclare @sql varchar(8000)declare @sqlValues varchar(8000)set @sql =' ('set @sqlValues = 'values (''+'select @sqlValues = @sqlValues + cols + ' + '','' + ' ,@sql = @sql + '[' + name + '],'from(select casewhen xtype in (48,52,56,59,60,62,104,106,108,122,127) then 'case when '+ name +' is null then ''NULL'' else ' + 'cast('+ name + ' as varchar)'+' end'when xtype in (58,61,40,41,42)then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'cast('+ name +' as varchar)'+ '+'''''''''+' end'when xtype in (167)then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'replace('+ name+','''''''','''''''''''')' + '+'''''''''+' end'when xtype in (231)then 'case when '+ name +' is null then ''NULL'' else '+'''N'''''' + ' + 'replace('+ name+','''''''','''''''''''')' + '+'''''''''+' end'when xtype in (175)then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'cast(replace('+ name+','''''''','''''''''''') as Char(' + cast(length as varchar) + '))+'''''''''+' end'when xtype in (239)then 'case when '+ name +' is null then ''NULL'' else '+'''N'''''' + ' + 'cast(replace('+ name+','''''''','''''''''''') as Char(' + cast(length as varchar) + '))+'''''''''+' end'else '''NULL'''end as Cols,namefrom syscolumns where id = object_id(@tablename)) TIF (@number!=0 AND @number IS NOT NULL)BEGINset @sql ='select top '+ CAST(@number AS VARCHAR(6000))+' ''INSERT INTO ['+ @tablename + ']' + left(@sql,len(@sql)-1)+') ' + left(@sqlValues,len(@sqlValues)-4) + ')'' from '+@tablenameprint @sqlENDELSEBEGIN set @sql ='select ''INSERT INTO ['+ @tablename + ']' + left(@sql,len(@sql)-1)+') ' + left(@sqlValues,len(@sqlValues)-4) + ')'' from '+@tablenameprint @sqlENDPRINT @whereClauseIF ( @whereClause IS NOT NULL AND @whereClause <> '')BEGINset @sql =@sql+' where '+@whereClauseprint @sqlENDexec (@sql)endGO 

調(diào)用示例

--非dbo默認架構(gòu)需注意--支持數(shù)據(jù)類型 :bigint,int, bit,char,datetime,date,time,decimal,money, nvarchar(50),tinyint, nvarchar(max),varchar(max),datetime2--調(diào)用示例 如果top行或者where條件為空,只需要把參數(shù)填上nullspGenInsertSQL 'customer' --表名, 2 --top 行數(shù), 'city=3 and didian=''大連'' ' --where 條件--導出全表 where條件為空spGenInsertSQL 'customer' --表名, null --top 行數(shù),null --where 條件INSERT INTO [Department] ([DepartmentID],[Name],[GroupName],[Company],[ModifiedDate]) values (1,N'售后部',N'銷售組',N'中國你好有限公司XX分公司','05 5 2015 5:58PM')INSERT INTO [Department] ([DepartmentID],[Name],[GroupName],[Company],[ModifiedDate]) values (2,N'售后部',N'銷售組',N'中國你好有限公司XX分公司','05 5 2015 5:58PM') 

以上所述是本文給大家分享的將表里的數(shù)據(jù)批量生成INSERT語句的存儲過程 增強版,希望大家喜歡。



注:相關(guān)教程知識閱讀請移步到MSSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
亚洲欧美久久婷婷爱综合一区天堂| 国产三级在线观看| 免费高清av| 欧洲亚洲精品视频| www.99色.com| 国产在线观看18| 国产精品视频一区二区免费不卡| 国产一级片网站| 国产视频资源| av片在线观看| 国产理论在线观看| 亚洲视频在线网| 国产亚洲依依| 夜夜操天天干| 69久久精品| 国内精品一区视频| 精品一区二区三区在线成人| 免费男女羞羞的视频网站中文字幕| 国内精品一区视频| 精品av中文字幕在线毛片| 亚洲wwwwww| 国产无遮挡又黄又爽免费网站| 精品国产一区二区三区四区阿崩 | 精品一区二区在线欧美| 91欧美在线视频| 丁香视频免费观看| 亚洲色婷婷综合开心网| 国产人成在线观看| 狂野欧美性猛交xxxx乱大交| 18激情网站| 国产一区二区三区不卡免费观看| av免费在线观| 精品美女视频在线观看免费软件| 成av人免费青青久| 亚洲国产成人综合| 精品街拍一区二区| 91精选福利| 精品视频一二区| 国产成人精品实拍在线| 豆国产97在线|亚洲| 免费在线看v| 日p在线观看| japanese色国产在线看视频| 国产精品伦一区二区三区视频| 国产男女无套在线播放| 欧美人成在线观看网站高清| av在线中文| 全网国产福利在线播放| 欧美日韩在线视频免费观看 | av一级在线| 69久久久久| 99re6在线视频精品免费| 在线天堂中文| 日本高清中文字幕| 丁香视频五月| 在线中文av| 超碰免费在线观看| 国产女人在线观看| 国产午夜精品久久久久免费视| 国产一区二区三区美女秒播| 国产不卡在线| 日本黄色免费网址| 中文字幕专区| 69久久精品| 欧美人成在线观看网站高清| 好男人社区在线视频| 国产麻豆精品入口在线观看| 国产精品剧情一区二区三区| 亚洲高清在线免费| 最新中文字幕av专区| 亚洲网站一区| 国产美女极品在线| 精品久久九九| 国产乱码在线| 超碰人人在线| 亚洲第一页在线播放| 国产亚洲精品久久久久久移动网络 | 中文字幕2019第三页| 久久香蕉一区| av高清在线| 国产欧美在线观看视频| 欧美性xxxx交| 亚洲欧美精品日韩欧美| 国产精品一品| 日本aⅴ写真网站免费| 国产成人精品实拍在线| 久久久久久77777| 亚洲高清在线免费| 中文av在线播放| 99热最新网址| 麻豆网站在线| www.操.com| www.狠狠操| 天堂√中文在线| 夜夜爽夜夜操| 精品女厕厕露p撒尿| 国产网站在线免费观看| 好男人免费精品视频| 久热国产在线| 丁香六月婷婷| 最近中文字幕在线中文视频 | www.大网伊人| 一级二级三级在线观看| 国产黄色免费在线观看| 国产精品入口麻豆电影| 国产精品18久久久久网站| 午夜视频在线观看网站午夜视频在线| 青青草视频免费在线观看| www.超级碰| 午夜国产福利在线| 国产女主播在线| 国产精品白浆流出视频| 国产欧美日韩第一页| 国产超碰在线| av影视在线看| 国产在线一二三| 国产欧美久久久久久久久| 国产成人综合美国十次| 国产福利免费观看| 香蕉视频在线观看www| 国产自产视频| 国产成人无吗| 激情视频国产| 99在线免费观看| 久久精品国产亚洲777| 国产色在线播放| www.狠狠操.com| 国产三级视频在线看| 亚洲xxxxxx| 国产精品欧美韩国日本久久| 精品av中文字幕在线毛片| 青青草在线免费观看| 国产偷窥老熟盗摄视频| 99精品老司机免费视频| 国产在线第一页| 精品伦理一区二区| 日本中文字幕高清视频| 玖玖在线视频| 一本大道久久a久久精品| 国产羞羞视频在线播放| 超碰在线国产| www.操.com| 97一区二区三区| 综合蜜桃精品| 噜噜噜噜噜在线视频| 在线视频三级| 国产成人午夜电影| 国产一卡2卡3卡4卡网站免费| 夜夜爽视频导航| 国产精品伦一区二区三区级视频频 | 最近中文av字幕在线中文| 亚洲精品视频区| 在线亚洲不卡| 国产精品福利视频一区二区三区| 国产中文字幕在线播放| heisi视频网在线观看| 国产午夜精品一区理论片| 男人天堂亚洲| 开心婷婷激情五月| 九色在线网站| 大香伊人中文字幕精品| 国产麻豆精品一区二区三区v视界| 欧美性猛交xxxx免费看久久| 阿v免费在线观看| 日本成人a视频| 黄污在线观看| 国产乱码在线| 2019中文字幕视频| av高清在线| 青青青青在线| 高清av中文在线字幕观看1| 日本啊v在线| 国内精品不卡| 国产三级视频在线看| 国产成人亚洲综合小说区| 精品国内自产拍在线视频| 亚洲欧美久久婷婷爱综合一区天堂 | 青青九九免费视频在线| 激情网站在线| 国产三级自拍| av在线资源网| 天天操人人爽| 在线观看中文字幕| 日韩欧美中文字幕不卡| 久久99亚洲网美利坚合众国| 国产一二三区在线| 亚洲高清在线免费| 黄色电影网站在线观看| 国产精品入口麻豆电影| 亚洲第一成人在线视频| 狠狠干天天爱| 91麻豆精品国产91久久| www.亚洲视频| 国产精品二线| 麻豆国产视频| av手机免费在线观看| 91av久久| 高潮毛片在线观看| 国产亚洲精品久久久久久青梅| 亚洲免费网站在线观看|