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语句的更多相关文章

  1. 利用sql 存储过程把表中内容自动生成insert语句

    选中所在数据库 执行创建存储过程的sql CREATE proc [dbo].[spGenInsertSQL] (@tablename nvarchar(256),@sqlwhere varchar( ...

  2. 将excle表中得数据生成insert语句插入到数据库中

    第一步:输入公式 第二步:拽住右下角得+往下拖拽

  3. 如何将sqlserver表中的数据导出sql语句或生成insert into语句 [转]

    输入表名,生成插入语句 drop proc proc_insert //如果存在就删除 go create proc proc_insert (@tablename varchar(256)) as ...

  4. 表中相同数据的sql语句

    1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select   peopleId from  ...

  5. oracle----修改表中的数据

    1. 修改表中的数据:UPDATE语句: 语法: UPDTAE table_name SET column1 = value1,... [WHERE conditions] (2),无条件的更新(没有 ...

  6. (笔记)Mysql命令insert into:向表中插入数据(记录)

    insert into命令用于向表中插入数据. insert into命令格式:insert into <表名> [(<字段名1>[,..<字段名n > ])] v ...

  7. Mysql命令insert into:向表中插入数据(记录)

    insert into命令用于向表中插入数据. insert into命令格式:insert into <表名> [(<字段名1>[,..<字段名n > ])] v ...

  8. 自由导入你的增量数据-根据条件将sqlserver表批量生成INSERT语句的存储过程实施笔记

    文章标题: 自由导入你的增量数据-根据条件将sqlserver表批量生成INSERT语句的存储过程增强版 关键字 : mssql-scripter,SQL Server 文章分类: 技术分享 创建时间 ...

  9. 【MYSQL 清空所有的的表中的数据的SQL的生成】

    MYSQL 清空所有的的表中的数据的SQL的生成 select Concat('TRUNCATE TABLE ', TABLE_NAME, ';') from INFORMATION_SCHEMA.T ...

随机推荐

  1. Vim 配色设置与配色脚本语法

    几个给tag加颜色的插件 https://github.com/octol/vim-cpp-enhanced-highlight:基于tag的c family语法高亮 https://github.c ...

  2. UVa 1393 (容斥原理、GCD) Highways

    题意: 给出一个n行m列的点阵,求共有多少条非水平非竖直线至少经过其中两点. 分析: 首先说紫书上的思路,编程较简单且容易理解.由于对称性,所以只统计“\”这种线型的,最后乘2即是答案. 枚举斜线包围 ...

  3. Linux 模拟 鼠标 键盘 事件

    /************************************************************************ * Linux 模拟 鼠标 键盘 事件 * 说明: ...

  4. UVA 753 A Plug for UNIX 电器插座(最大基数匹配,网络流)

    题意: 给n个插座,m个设备(肯定要插电了),k种转换头可无限次使用(注意是单向的),问有多少设备最终是不能够插上插座的? 分析: 看起来就是设备匹配插座,所以答案不超过m.这个题适合用网络流来解. ...

  5. EF Code First 学习笔记:表映射

    多个实体映射到一张表 Code First允许将多个实体映射到同一张表上,实体必须遵循如下规则: 实体必须是一对一关系 实体必须共享一个公共键 观察下面两个实体: public class Perso ...

  6. 我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp)

    我的Modbus Slave/Client开发历程(Rtu/AscII/Tcp) 分类: [自动化]2007-07-19 10:04 34038人阅读 评论(38) 收藏 举报 vb嵌入式dostcp ...

  7. Visual Studio中的一些较大的文件的作用

    1.sdf 这些是工程中的中间,用于预编译等作用,最终可执行文件是不需要的,默认情况下,删除后重新编译还会生成.如果不需要,在Visual Studio里进入如下设置: 进入"Tools & ...

  8. 28、activity之间传递数据&批量传递数据

    import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android ...

  9. Windbg源码调试

    Windbg提供比VS2008丰富很多的调试命令,尤其是调试多线程程序. 今天试着怎么使用源代码方式调试.为了说明调试命令,<C++标准库>一书里的例子做示范. // testcast.c ...

  10. BNU 51275 道路修建 Large 并查集

    分析(引入Q神题解  %%%Q) 如果使用可持久化并查集,二分答案判定连通性,复杂度是O(mlog3n),不能在时限内出解.考虑到并查集实际上是一棵树,可以尝试在边上维护一些信息,假设t时刻加了一条边 ...