利用存储过程将表中的数据生成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而特有的注释语句.这 ...
- 使用EventLog类写Windows事件日志
在程序中经常需要将指定的信息(包括异常信息和正常处理信息)写到日志中.在C#3.0中可以使用EventLog类将各种信息直接写入Windows日志.EventLog类在System.Diagnosti ...
- 解决ImportError: cannot import name HTTPConnection的方法
在写python程序的时候,使用from httplib import HTTPConnection,在run的时候提示ImportError: cannot import name HTTPConn ...
- Zookeeper基本知识
Zookeeper的Session: (1)客户端和server间采用长连接 (2)连接建立后,server产生session ID(64位)返还给客户端 (3)客户端定期发送ping包来检查和保持和 ...
- Java面试题-多线程
1. java中有几种方法可以实现一个线程? 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口. 这两种方法的区别是,如果你的类已经继承了其它的类,那么你只能选择实现Runna ...
- poj2392
首先按限制高度排序,然后按多重背包做dp 这里的背包只用知道每种状态是否可行,所以 这里的多重背包可以变成O(nm) ; ..,..,..] of longint; a,b:..] of lo ...
- bzoj题解
bzoj1012 线段树水题 bzoj1207 LIS水题 bzoj2190 挡住,即 bzoj1601 已被删除的水题? bzoj1607 线段树细节题,搞清楚特判即可 bzoj1008 快速幂妥妥 ...
- 信息学院第九届ACM程序设计竞赛题解
A: 信号与系统 Time Limit: 1000 MS Memory Limit: 65536 KBTotal Submit: 238 Accepted: 44 Page View: 69 Des ...
- OK335xS EMMC Partition hacking
#! /bin/sh # # OK335xS EMMC Partition hacking # 说明: # 本文主要是为了解读同事对EMMC分区的写法,其中有很多写法重复了,但 # 依然尽量保留其作者 ...
- android LayoutInflater和inflate()方法的用法(转载)
原文出处:http://www.cnblogs.com/top5/archive/2012/05/04/2482328.html 在实际开发中LayoutInflater这个类还是非常有用的,它的作用 ...