利用存储过程将表中的数据生成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 ... 
随机推荐
- ExtJs双ActionResult共用同一Js文件ID冲突解决方案
			项目使用MVC+ExtJs实现,权限控制是基于Controller下的ActionResult的,有一个页面因参数不同就需要新建两个ActionResult. 不要问我为何是基于页面级,而不是数据级, ... 
- HAOI2006受欢迎的牛
			求出强联通分量之后判断出度为0的点有几个,有1个就输出这个分量的点的数目,否则输出0: var i,j,n,m,x,y,ans1,ans2,t,cnt,top:longint; head,next,g ... 
- 解决iframe缓存
			网上能搜到很多此类的资料,但都是互相转载,不太起作用.这几天写个用到,用了不少的iframe效果.结果发现iframe有缓存的问题.网上提供了思路,即对iframe的href后添加随即get值,来逃避 ... 
- jquery自动生成分页控件  - pagetest.js
			/* pagenum:当前页数 theallnum:总条数 themeiye:每页显示多少条 */ function pagetest(pagenum, theallnum, themeiye) { ... 
- 【开源专访】Sea.js创始人玉伯的前端开发之路
			摘要:玉伯,淘宝前端类库 KISSY.前端模块化开发框架SeaJS.前端基础类库Arale的创始人.本期[开源专访]我们邀请玉伯来为我们分享一些关于前端框架.前端开发的那些事,以及前端大牛是如何炼成的 ... 
- 从ramdisk根文件系统启动Linux成功
			这几天参考国嵌的实验手册和网上的资料完成了u-boot定制.内核定制.ramdisk根文件系统的制作,并成功.趁热打铁,总结一下.本文引用了很多网络上的文章,就不一一注明了.感谢各大侠的帮助,如有雷同 ... 
- poj 3279  Fliptile
			题意:一个n * m的棋盘,0或1,每次改变一个格子时同时改变上下左右的格子,问用最少次数将棋盘全变成0的策略. 题解:用二进制压缩第一行更改的状态,之后遍历棋盘,如果当前格子为1则改变下方的格子,记 ... 
- memcache 存储单个KEY,数据量过大的时候性能慢!以及简单的memcache不适合用到的场景
			今天有人问到我:memcache存储大数据量,10K,100K,1M的时候,效果怎么样??我回答:不好,效果非常慢.对方问:为什么啊??我回答不上来...于是就找了点资料. memcached使用需要 ... 
- HDU 5617 Jam's maze  巧妙DP
			题意:给你一个字符矩阵,从(1,1)到(n,n)有很多种走法,每一种走法形成一个字符串,问有多少种走法形成的字符串是回文的 分析:(粘贴BC题解) 的是回文串,有人会想到后缀数组自动机马拉车什么的,其 ... 
- [selenium webdriver Java]检查元素状态
			许多测试失败是因为点击一个元素失败或者在一个不可见的字段中输入文字,或者是在不可输入的文本中输入文字. 我们可以在具体操作之前,检查一下元素的状态.WebElement类提供了这样的方法. 方法 目的 ... 
