利用存储过程将表中的数据生成Insert语句
1、创建存储过程
CREATE PROC [dbo].[sp_get_InsertSql] @dbName VARCHAR ( )= '' , -- 数据库名称 @tabList VARCHAR ( max ), -- 要导出数据的表名,表名之间用逗号隔开,过滤条件跟在表名后面,用空格隔开如 tab1 where col1!=, tab2, tab3 @IncludeIdentity BIT = , -- 是否包含自增字段 @DeleteOldData BIT = -- 插入前删除所有数据 AS DECLARE @index INT , @wi INT , @SQL VARCHAR ( max ), @SQL1 VARCHAR ( max ), @tabName VARCHAR ( ), @colName VARCHAR ( ), @colType VARCHAR ( ), @tabPrefix VARCHAR ( ), @cols VARCHAR ( max ), @colsData VARCHAR ( max ), @SQLWhere VARCHAR ( ), @SQLIdentityOn VARCHAR ( MAX ), @SQLIdentityOff VARCHAR ( MAX ), @SQLDelete VARCHAR ( max ), @SQLIfBegin VARCHAR ( ), @SQLIfEnd VARCHAR ( ), @SQLNull VARCHAR ( ); DECLARE @t_tb TABLE ( TB varchar ( ), Sqlwhere varchar ( ), SN BIGINT IDENTITY ( , )) DECLARE @tb TABLE ( insert_sql VARCHAR ( max ), SN BIGINT IDENTITY ( , )); DECLARE @colList TABLE ( colName VARCHAR ( ), colType VARCHAR ( ), colValueL VARCHAR ( ), colValueR VARCHAR ( ), selColName VARCHAR ( )); BEGIN SET NOCOUNT ON SET @tabList = REPLACE ( @tabList, CHAR ( ), '' ) SET @tabList = REPLACE ( @tabList, CHAR ( ), '' ) SET @tabList = REPLACE ( @tabList, CHAR ( ), '' ) SET @dbName = LTRIM ( RTRIM ( @dbName)) SET @index = CHARINDEX ( ',' , @tabList) IF LEN ( @dbName) > SET @tabPrefix = @dbName + '..' ELSE SET @tabPrefix = '' ; WHILE @index > AND @index IS NOT NULL BEGIN SET @tabName = SUBSTRING ( @tabList, , @index- ) SET @wi= CHARINDEX ( ' where' , LTRIM ( @tabName)) IF @wi= SET @wi = LEN ( @tabName) INSERT INTO @t_tb( tb, Sqlwhere) VALUES ( SUBSTRING ( @tabName, , @wi), SUBSTRING ( @tabName, @wi+ , LEN ( @tabName)- @wi)) SET @tabList = SUBSTRING ( @tabList, @index+ , LEN ( @tabList)- @index) SET @index = CHARINDEX ( ',' , @tabList) END IF @index = OR @index IS NULL SET @tabName = @tabList ELSE SET @tabName = SUBSTRING ( @tabList, , @index) SET @wi= CHARINDEX ( ' where' , LTRIM ( @tabName)) IF @wi= SET @wi = LEN ( @tabName) INSERT INTO @t_tb( tb, Sqlwhere) VALUES ( SUBSTRING ( @tabName, , @wi), SUBSTRING ( @tabName, @wi+ , LEN ( @tabName)- @wi)) SELECT @SQL1 = 'select INSERT_SQL='';SET NOCOUNT ON' + CHAR ( ) + '''' + ' union all ' SELECT @SQLNull = 'select INSERT_SQL='' '' union all ' , @SQLIfBegin = 'select INSERT_SQL='' If @Error=0 begin ''' + ' union all ' , @SQLIfEnd = ' union all ' + 'select INSERT_SQL='' end;''' DECLARE tab_cur CURSOR FOR SELECT t. name , tb. Sqlwhere FROM sys.tables t INNER JOIN @t_tb tb ON t. name = RTRIM ( LTRIM ( tb. TB)) ORDER BY tb. SN OPEN tab_cur FETCH NEXT FROM tab_cur INTO @tabName, @SQLWhere WHILE @@FETCH_STATUS = BEGIN DELETE FROM @colList IF NOT EXISTS( SELECT FROM sys.objects WHERE name = @tabName AND type = 'U' ) BEGIN PRINT ( @tabName + N' 不存在! ' ) RAISERROR ( @tabName, , - ); FETCH NEXT FROM tab_cur INTO @tabName, @SQLWhere CONTINUE ; END INSERT INTO @colList( colName, colType, colValueL, colValueR) SELECT c. NAME , t. name , '' , '' FROM sys.columns c INNER JOIN sys.tables tab ON c. object_id = tab. object_id INNER JOIN sys.types t ON c. user_type_id = t. user_type_id WHERE c. is_computed= AND tab. name = @tabName IF @IncludeIdentity= DELETE FROM @colList WHERE colName IN( SELECT name FROM sys.columns WHERE object_id = OBJECT_ID ( @tabName) AND is_identity= ) UPDATE @colList SET colValueL= 'RTRIM(' , colValueR = ')' WHERE colType IN( 'text' , 'varchar' , 'nvarchar' , 'char' , 'uniqueidentifier' , 'datetime' , 'nchar' , 'sysname' ) SELECT @cols= '' , @colsData = '' , @SQL = '' ; UPDATE @colList SET colName = '[' + colName + ']' UPDATE @colList SET selColName= colName UPDATE @colList SET colValueL= 'replace(' + colValueL, colValueR = colValueR+ ','''''''','''''''''''')' WHERE colType IN( 'text' , 'varchar' , 'nvarchar' , 'char' , 'nchar' , 'sysname' ) UPDATE @colList SET colValueL= CASE WHEN colType IN( 'text' , 'varchar' , 'nvarchar' , 'char' , 'uniqueidentifier' , 'datetime' , 'nchar' , 'sysname' ) THEN '''''''''+' ELSE '' END + colValueL, colValueR = colValueR + CASE WHEN colType IN( 'text' , 'varchar' , 'nvarchar' , 'char' , 'nchar' , 'datetime' , 'uniqueidentifier' , 'sysname' ) THEN '+''''''''' ELSE '' END SELECT @cols = @cols + colName + ', ' , @colsData = @colsData + 'isnull(' + colValueL + CASE WHEN colType= 'datetime' THEN 'convert(varchar(20),' + colName+ ',120)' WHEN colType= 'uniqueidentifier' THEN 'convert(varchar(50),' + colName+ ')' WHEN colType= 'text' THEN 'convert(nvarchar(max),' + colName+ ')' WHEN colType= 'sysname' THEN 'convert(nvarchar(max),' + colName+ ')' WHEN colType= 'varbinary' OR colType= 'BINARY' OR colType= 'image' THEN 'master.dbo.fn_varbintohexsubstring(1,' + colName+ ',1,0)' ELSE 'cast(' + colName+ ' as nvarchar(max))' END + colValueR + ',''null'')+'', ''+' FROM @colList SELECT @cols = LEFT( @cols, LEN ( @cols)- ), @colsData = LEFT( @colsData, LEN ( @colsData)- ), @SQL = 'select INSERT_SQL=''print ''''Table Name: ' + CHAR ( )+ @tabName + '''''''' + ' union all ' SELECT @cols = 'select INSERT_SQL=''INSERT INTO ' + @tabPrefix + @tabName + '(' + @cols+ ')' , @colsData = ' VALUES(''+' + @colsData + '+'');'' FROM ' + @tabPrefix + @tabName SELECT @colsData = @colsData + ' ' + ISNULL ( @SQLWhere, '' ) IF @DeleteOldData= SET @SQLDelete = 'select INSERT_SQL='''' + ''Delete from ' + @tabPrefix + @tabName + '; ''' + ' union all ' ELSE SET @SQLDelete= '' IF @IncludeIdentity= AND EXISTS( SELECT FROM sys.columns WHERE object_id = OBJECT_ID ( @tabName) AND is_identity= ) BEGIN SELECT @SQLIdentityOn = 'select INSERT_SQL=''SET IDENTITY_INSERT ' + @tabPrefix + @tabName + ' ON;''' + ' union all ' , @SQLIdentityOff = ' union all ' + 'select INSERT_SQL=''SET IDENTITY_INSERT ' + @tabPrefix + @tabName + ' OFF;''' END ELSE BEGIN SELECT @SQLIdentityOff = '' , @SQLIdentityOn = '' ; END INSERT INTO @tb( insert_sql) EXECUTE ( @SQLNull + @SQLIfBegin + @SQL+ @SQLDelete+ @SQLIdentityOn + @cols+ @colsData + @SQLIdentityOff + @SQLIfEnd) FETCH NEXT FROM tab_cur INTO @tabName, @SQLWhere END CLOSE tab_cur DEALLOCATE tab_cur SELECT insert_sql FROM @tb ORDER BY sn END
2、执行存储过程
EXECUTE [dv_etc].[dbo].[sp_get_InsertSql]
@dbName='dv_etc' --数据库名称
,@tabList='etc_city' --表名称
,@IncludeIdentity=
,@DeleteOldData=
利用存储过程将表中的数据生成Insert语句的更多相关文章
- 利用sql 存储过程把表中内容自动生成insert语句
选中所在数据库 执行创建存储过程的sql CREATE proc [dbo].[spGenInsertSQL] (@tablename nvarchar(256),@sqlwhere varchar( ...
- 将excle表中得数据生成insert语句插入到数据库中
第一步:输入公式 第二步:拽住右下角得+往下拖拽
- 如何将sqlserver表中的数据导出sql语句或生成insert into语句 [转]
输入表名,生成插入语句 drop proc proc_insert //如果存在就删除 go create proc proc_insert (@tablename varchar(256)) as ...
- 表中相同数据的sql语句
1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select peopleId from ...
- oracle----修改表中的数据
1. 修改表中的数据:UPDATE语句: 语法: UPDTAE table_name SET column1 = value1,... [WHERE conditions] (2),无条件的更新(没有 ...
- (笔记)Mysql命令insert into:向表中插入数据(记录)
insert into命令用于向表中插入数据. insert into命令格式:insert into <表名> [(<字段名1>[,..<字段名n > ])] v ...
- Mysql命令insert into:向表中插入数据(记录)
insert into命令用于向表中插入数据. insert into命令格式:insert into <表名> [(<字段名1>[,..<字段名n > ])] v ...
- 自由导入你的增量数据-根据条件将sqlserver表批量生成INSERT语句的存储过程实施笔记
文章标题: 自由导入你的增量数据-根据条件将sqlserver表批量生成INSERT语句的存储过程增强版 关键字 : mssql-scripter,SQL Server 文章分类: 技术分享 创建时间 ...
- 【MYSQL 清空所有的的表中的数据的SQL的生成】
MYSQL 清空所有的的表中的数据的SQL的生成 select Concat('TRUNCATE TABLE ', TABLE_NAME, ';') from INFORMATION_SCHEMA.T ...
随机推荐
- java文档注释主要使用方法
一.java包含哪些注释 1.//用于单行注释. 2./*...*/用于多行注释,从/*开始,到*/结束,不能嵌套. 3./**...*/则是为支持jdk工具javadoc.exe而特有的注释语句.这 ...
- xp主机用VMware9和10安装Ubuntu12.04后无法进入图像界面
xp主机用VMware9和10安装Ubuntu12.04后无法进入图像界面 备注:虚拟机安装Ubuntu12.04 64位版本 刚开始我用VMware-workstation-full-8.0.3来安 ...
- win设置壁纸
默认壁纸图片位置: C:\Windows\Web\Wallpaper\Scenes 你可以自己建文件夹,放自己喜欢的桌面壁纸. 设置壁纸: 桌面右键 -> 个性化 然后点击 “桌面背景” - ...
- windows8安装xna4.0不能开发Xbox和PC端游戏的解决办法
vs2012安装wp8后,只能开发手机端的xna游戏程序,没有xbox和pc端的,看来官方是不打算更新了,不过我们还是有办法的. 前提条件下,您得安装了vs2010和xna4.0 game studi ...
- ASP.NE的缓存技术提高Web站点的性能
一:我们为什么要使用缓存? 先来理解一下asp.net缓存技术的基本原理:把访问频繁的数据以及需要花大量的时间来加载的数据缓存在内存中,那么用户在下次请求同样的数据时,直接将内存中的数据返回给用户,从 ...
- amoeba-mysql配置安装(收集整理)
本文收集整理自: Amoeba搞定mysql主从读写分离 http://blog.chinaunix.net/uid-20639775-id-154600.html Amoeba非常好用的mysql集 ...
- php网页显示正方形图片缩略图
需求是这样的:原始图片的大小是不定的,类似800*600.1000*756,现有一个页面要以正方形(60*60)显示这些图片,注意:图片只能在内存处理,不能缩小后保存到本地磁盘. 解决办法: html ...
- Asp.Net MVC 模型(使用Entity Framework创建模型类) - Part.1
这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...
- Hrbust 2240 土豪的时代
题意:中文题……不总结了……(好懒0-0) 土豪圈有一个习惯:从来不告诉别人自己到底有多少钱.但他们总是喜欢和其他土豪比较,来看看谁更土豪.于是每每几天,就会爆出一些关于土豪资产的消息,比如A土豪比B ...
- (Java)《head first java》值得Java或面向对象基础的新手看。
看完这本书后本人收获良多. 内容对Java以及面向对象的入门者非常友好. 抽象的内容惯用图解的方法来剖析,通俗易懂 之前看C#入门经典的面向对象时,依然浓浓的一头雾水. (1)很不解为何实例化要写成A ...