sql server 2005生成insert语句,同时完成多表(Bug:插入语句列列表最后一列列名后还带有,)
2012-02-27 14:54
525 查看
-- =======================================================================================
/*
Example:
EXEC sp_get_InsertSql @dbName='',
@tabList='tb1 where id=0,
tb2 WHERE id=0,
tb3, tb4',
@IncludeIdentity=1,
@DeleteOldData=0
*/
-- =======================================================================================
CREATE PROC [dbo]. [sp_get_InsertSql]
@dbName VARCHAR ( 32)= '' , -- 数据库名称
@tabList VARCHAR ( max ), -- 要导出数据的表名,表名之间用逗号隔开,过滤条件跟在表名后面,用空格隔开如 tab1 where col1!=2, tab2, tab3
@IncludeIdentity BIT = 1, -- 是否包含自增字段
@DeleteOldData BIT = 1 -- 插入前删除所有数据
AS
DECLARE
@index INT ,
@wi INT ,
@SQL VARCHAR ( max ),
@SQL1 VARCHAR ( max ),
@tabName VARCHAR ( 128),
@colName VARCHAR ( 128),
@colType VARCHAR ( 128),
@tabPrefix VARCHAR ( 32),
@cols VARCHAR ( max ),
@colsData VARCHAR ( max ),
@SQLWhere VARCHAR ( 1024),
@SQLIdentityOn VARCHAR ( MAX ),
@SQLIdentityOff VARCHAR ( MAX ),
@SQLDelete VARCHAR ( max ),
@SQLIfBegin VARCHAR ( 1024),
@SQLIfEnd VARCHAR ( 1024),
@SQLNull VARCHAR ( 1024);
DECLARE @t_tb TABLE ( TB varchar ( 128), Sqlwhere varchar ( 1024), SN BIGINTIDENTITY ( 1, 1))
DECLARE @tb TABLE ( insert_sql VARCHAR ( max ), SN BIGINT IDENTITY ( 1, 1));
DECLARE @colList TABLE ( colName VARCHAR ( 128), colType VARCHAR ( 128),
colValueL VARCHAR ( 120), colValueR VARCHAR ( 120), selColName VARCHAR ( 128));
BEGIN
SET NOCOUNT ON
SET @tabList = REPLACE ( @tabList, CHAR ( 9), '' )
SET @tabList = REPLACE ( @tabList, CHAR ( 10), '' )
SET @tabList = REPLACE ( @tabList, CHAR ( 13), '' )
SET @dbName = LTRIM ( RTRIM ( @dbName))
SET @index = CHARINDEX ( ',' , @tabList)
IF LEN ( @dbName) > 0
SET @tabPrefix = @dbName + '..'
ELSE
SET @tabPrefix = '' ;
WHILE @index > 0 AND @index IS NOT NULL
BEGIN
SET @tabName = SUBSTRING ( @tabList, 1, @index- 1)
SET @wi= CHARINDEX ( ' where' , LTRIM ( @tabName))
IF @wi= 0
SET @wi = LEN ( @tabName)
INSERT INTO @t_tb( tb, Sqlwhere) VALUES ( SUBSTRING ( @tabName, 1, @wi),SUBSTRING ( @tabName, @wi+ 1, LEN ( @tabName)- @wi))
SET @tabList = SUBSTRING ( @tabList, @index+ 1, LEN ( @tabList)- @index)
SET @index = CHARINDEX ( ',' , @tabList)
END
IF @index = 0 OR @index IS NULL
SET @tabName = @tabList
ELSE
SET @tabName = SUBSTRING ( @tabList, 1, @index)
SET @wi= CHARINDEX ( ' where' , LTRIM ( @tabName))
IF @wi= 0
SET @wi = LEN ( @tabName)
INSERT INTO @t_tb( tb, Sqlwhere) VALUES ( SUBSTRING ( @tabName, 1, @wi), SUBSTRING( @tabName, @wi+ 1, LEN ( @tabName)- @wi))
SELECT @SQL1 = 'select INSERT_SQL='';SET NOCOUNT ON' + CHAR ( 13) + '''' +
' 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 = 0 BEGIN
DELETE FROM @colList
IF NOT EXISTS( SELECT 1 FROM sys.objects WHERE name = @tabName AND type = 'U' )BEGIN
PRINT ( @tabName + N' 不存在! ' )
RAISERROR ( @tabName, 16, - 1);
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= 0
AND tab. name = @tabName
IF @IncludeIdentity= 0
DELETE FROM @colList WHERE colName IN(
SELECT name FROM sys.columns WHERE object_id = OBJECT_ID ( @tabName) ANDis_identity= 1)
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)- 1),
@colsData = LEFT( @colsData, LEN ( @colsData)- 5),
@SQL = 'select INSERT_SQL=''print ''''Table Name: ' + CHAR ( 9)+@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= 1
SET @SQLDelete = 'select INSERT_SQL='''' +
''Delete from ' + @tabPrefix + @tabName + '; ''' +
' union all '
ELSE
SET @SQLDelete= ''
IF @IncludeIdentity= 1 AND EXISTS( SELECT 1 FROM sys.columns WHERE object_id =OBJECT_ID ( @tabName) AND is_identity= 1)
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
原文: http://blog.csdn.net/songguozhi/article/details/6087323
/*
Example:
EXEC sp_get_InsertSql @dbName='',
@tabList='tb1 where id=0,
tb2 WHERE id=0,
tb3, tb4',
@IncludeIdentity=1,
@DeleteOldData=0
*/
-- =======================================================================================
CREATE PROC [dbo]. [sp_get_InsertSql]
@dbName VARCHAR ( 32)= '' , -- 数据库名称
@tabList VARCHAR ( max ), -- 要导出数据的表名,表名之间用逗号隔开,过滤条件跟在表名后面,用空格隔开如 tab1 where col1!=2, tab2, tab3
@IncludeIdentity BIT = 1, -- 是否包含自增字段
@DeleteOldData BIT = 1 -- 插入前删除所有数据
AS
DECLARE
@index INT ,
@wi INT ,
@SQL VARCHAR ( max ),
@SQL1 VARCHAR ( max ),
@tabName VARCHAR ( 128),
@colName VARCHAR ( 128),
@colType VARCHAR ( 128),
@tabPrefix VARCHAR ( 32),
@cols VARCHAR ( max ),
@colsData VARCHAR ( max ),
@SQLWhere VARCHAR ( 1024),
@SQLIdentityOn VARCHAR ( MAX ),
@SQLIdentityOff VARCHAR ( MAX ),
@SQLDelete VARCHAR ( max ),
@SQLIfBegin VARCHAR ( 1024),
@SQLIfEnd VARCHAR ( 1024),
@SQLNull VARCHAR ( 1024);
DECLARE @t_tb TABLE ( TB varchar ( 128), Sqlwhere varchar ( 1024), SN BIGINTIDENTITY ( 1, 1))
DECLARE @tb TABLE ( insert_sql VARCHAR ( max ), SN BIGINT IDENTITY ( 1, 1));
DECLARE @colList TABLE ( colName VARCHAR ( 128), colType VARCHAR ( 128),
colValueL VARCHAR ( 120), colValueR VARCHAR ( 120), selColName VARCHAR ( 128));
BEGIN
SET NOCOUNT ON
SET @tabList = REPLACE ( @tabList, CHAR ( 9), '' )
SET @tabList = REPLACE ( @tabList, CHAR ( 10), '' )
SET @tabList = REPLACE ( @tabList, CHAR ( 13), '' )
SET @dbName = LTRIM ( RTRIM ( @dbName))
SET @index = CHARINDEX ( ',' , @tabList)
IF LEN ( @dbName) > 0
SET @tabPrefix = @dbName + '..'
ELSE
SET @tabPrefix = '' ;
WHILE @index > 0 AND @index IS NOT NULL
BEGIN
SET @tabName = SUBSTRING ( @tabList, 1, @index- 1)
SET @wi= CHARINDEX ( ' where' , LTRIM ( @tabName))
IF @wi= 0
SET @wi = LEN ( @tabName)
INSERT INTO @t_tb( tb, Sqlwhere) VALUES ( SUBSTRING ( @tabName, 1, @wi),SUBSTRING ( @tabName, @wi+ 1, LEN ( @tabName)- @wi))
SET @tabList = SUBSTRING ( @tabList, @index+ 1, LEN ( @tabList)- @index)
SET @index = CHARINDEX ( ',' , @tabList)
END
IF @index = 0 OR @index IS NULL
SET @tabName = @tabList
ELSE
SET @tabName = SUBSTRING ( @tabList, 1, @index)
SET @wi= CHARINDEX ( ' where' , LTRIM ( @tabName))
IF @wi= 0
SET @wi = LEN ( @tabName)
INSERT INTO @t_tb( tb, Sqlwhere) VALUES ( SUBSTRING ( @tabName, 1, @wi), SUBSTRING( @tabName, @wi+ 1, LEN ( @tabName)- @wi))
SELECT @SQL1 = 'select INSERT_SQL='';SET NOCOUNT ON' + CHAR ( 13) + '''' +
' 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 = 0 BEGIN
DELETE FROM @colList
IF NOT EXISTS( SELECT 1 FROM sys.objects WHERE name = @tabName AND type = 'U' )BEGIN
PRINT ( @tabName + N' 不存在! ' )
RAISERROR ( @tabName, 16, - 1);
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= 0
AND tab. name = @tabName
IF @IncludeIdentity= 0
DELETE FROM @colList WHERE colName IN(
SELECT name FROM sys.columns WHERE object_id = OBJECT_ID ( @tabName) ANDis_identity= 1)
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)- 1),
@colsData = LEFT( @colsData, LEN ( @colsData)- 5),
@SQL = 'select INSERT_SQL=''print ''''Table Name: ' + CHAR ( 9)+@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= 1
SET @SQLDelete = 'select INSERT_SQL='''' +
''Delete from ' + @tabPrefix + @tabName + '; ''' +
' union all '
ELSE
SET @SQLDelete= ''
IF @IncludeIdentity= 1 AND EXISTS( SELECT 1 FROM sys.columns WHERE object_id =OBJECT_ID ( @tabName) AND is_identity= 1)
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
原文: http://blog.csdn.net/songguozhi/article/details/6087323
相关文章推荐
- sql server 2005生成insert语句,同时完成多表
- sql server 小数据插入,根据表名生成insert 语句,求加固
- sql server中表数据生成insert into插入语句
- 在SQL Server 2005中连接Oracle,完成查询、插入操作
- 数据库生成脚本-------创建语句的同时,把表中的数据也生成插入语句
- 动态生成多条插入语句如:insert into MyStudents values(“人名1”,年龄,‘男’,分数1,分数2)。将生成的插入语句输出到记事本文件 SQLStr.txt中
- 如何往有自增标识字段的表插入数据时,同时给自增标识字段插入值呢,在Inset Into语句前后加上SQL语句:SET IDENTITY_INSERT TableName ON和SET IDENTITY_INSERT TableName OFF
- 在SQL Server中SQL语句的Insert支持一次插入多条记录?
- MS-SQL生成表里数据的insert插入语句
- 批量生成insert into语句(带有数据)
- sql server根据表中数据生成insert语句
- SQL Server 2005 T-SQL Recipes------Insert, Update, Delete语句
- 批量生成insert into语句(带有数据)
- sql server 2005 创建新的一列,并插入数据
- SQL Server 动态生成数据库所有表Insert语句
- SQL Server自动生成INSERT语句(在SQL2005下测试通过)
- 使用一条INSERT语句完成多表插入
- SQL Server自动生成INSERT语句
- Sql Server 2000 2005 用Sql语句生成Sqlserver数据字典
- 在SQL Server中,SQL语句的Insert支持一次插入多条记录