SQL Server根据表或视图批量生成插入语句并BCP导出成文本

--声明变量
 DECLARE @TableName VARCHAR(100),@RunStr VARCHAR(MAX),@RunRC VARCHAR(MAX),@FinalRun VARCHAR(MAX)

 --在master库创建数据载体,也可以建立在其他数据库,但一定要是实体表,因为BCP导出不支持临时表
 IF OBJECT_ID(‘master.dbo.tempinsertstr‘) IS NOT NULL DROP TABLE master.dbo.tempinsertstr
 CREATE TABLE master.dbo.tempinsertstr(rowid INT IDENTITY(0,1),rowtext VARCHAR(MAX))
 INSERT master.dbo.tempinsertstr(rowtext) VALUES(‘reserved‘)

 --表或视图名称定义:
 SELECT @TableName=‘Reseller‘

 --拼凑表或视图字段信息,针对字符或时间类型的加单引号‘‘,为防止特殊字段名都加了[]
 SELECT @RunStr=ISNULL(@RunStr+‘+‘‘,‘‘+‘,‘‘)+‘ISNULL(‘+CASE WHEN T.name IN(‘nvarchar‘,‘varchar‘,‘char‘,‘text‘,‘datetime‘,‘date‘,‘datetime2‘) THEN
 ‘‘‘‘‘‘‘‘‘+LTRIM(‘+CASE WHEN T.name=‘text‘ THEN ‘CAST([‘+c.name+‘] as varchar(max)))+‘‘‘‘‘‘‘‘,‘‘NULL‘‘)‘ ELSE ‘[‘+c.name+‘])+‘‘‘‘‘‘‘‘,‘‘NULL‘‘)‘ END
 ELSE  ‘LTRIM([‘+c.name+‘]),‘‘NULL‘‘)‘  END  FROM dbo.syscolumns C
 INNER JOIN dbo.systypes T on C.xusertype=T.xusertype WHERE C.id = object_id(@TableName)
 AND (OBJECTPROPERTY(C.id, N‘IsUserTable‘) = 1 OR OBJECTPROPERTY(C.id,N‘IsView‘)=1) ORDER BY C.colorder

 --生成批量values语句:
 SET @RunRC=LOWER(‘ insert master.dbo.tempinsertstr(rowtext)
 select ‘+‘‘‘(‘‘+‘[email protected]+‘+‘‘),‘‘‘+‘ from ‘[email protected])

 --生成单条插入语句:
 --SET @RunStr=LOWER(‘
 --select ‘+‘‘‘insert into ‘[email protected]+‘ values(‘‘+‘[email protected]+‘+‘‘);‘‘‘+‘ from ‘[email protected])
 --EXEC master.dbo.PrintLongText @RunStr
 --EXEC master.dbo.PrintLongText @RunRC

 EXEC(@RunRC)

 --最后一段去除分号;信息
 UPDATE master.dbo.tempinsertstr SET rowtext=STUFF(rowtext,LEN(rowtext),1,‘;‘) WHERE rowid=(SELECT MAX(rowid) FROM master.dbo.tempinsertstr)

 --首行rowtext为reserved更新为insert into ... values语句:
 UPDATE master.dbo.tempinsertstr SET rowtext=‘insert into ‘+LOWER(@TableName)+‘ values‘ WHERE rowid=0

 --执行BCP导出为txt文本命令
 SELECT @FinalRun=‘
 EXEC master..xp_cmdshell ‘‘BCP "select rowtext from master.dbo.tempinsertstr" queryout E:\txt_test\‘[email protected]+‘.sql -c -t "," -T -C‘‘
 ‘

 EXEC(@FinalRun)

 DROP TABLE master.dbo.tempinsertstr;

 --以上代码编译成函数,可以多加一个打印sql的参数,便于调试
 --参数1:表名或视图名 参数2:BCP导出txt文本所要输出路径 参数3:默认0为直接执行,1只打印要执行的sql,不执行代码
 --EXEC usp_TableBatchInsert ‘tablename‘,‘E:\txt_test\‘,1

 --附上超长文本打印存储过程:
 CREATE PROC [dbo].[PrintLongText](@SQL VARCHAR(MAX))
AS
DECLARE @PrintText VARCHAR(8000) = ‘‘
WHILE LEN(@SQL) > 4000
BEGIN
 --修正末尾是空格出现的bug
 SELECT @PrintText = LEFT(@SQL, 4000) + ‘|‘
 SELECT @PrintText = LEFT(@PrintText, LEN(@PrintText) - CHARINDEX(CHAR(10), REVERSE(@PrintText)))
 SELECT @SQL = RIGHT(@SQL, LEN(@SQL) - LEN(@PrintText))  

 SELECT @PrintText=LEFT(@PrintText,LEN(@PrintText)-2)
 WHERE RIGHT(@PrintText,2) IN (CHAR(13)+CHAR(10), CHAR(10)+CHAR(13))  

 SELECT @PrintText=LEFT(@PrintText,LEN(@PrintText)-1)
 WHERE RIGHT(@PrintText,1) IN (CHAR(13),CHAR(10))
 --SELECT @PrintText=RIGHT(@PrintText,LEN(@PrintText)-1) WHERE LEFT(@PrintText,1) IN (CHAR(13),CHAR(10))  

 PRINT @PrintText  

 --PRINT ‘/*** len=‘ + cast(len(@PrintText) as varchar) + ‘ datalength=‘ + cast(datalength(@PrintText) as varchar) + ‘***/‘
END
SELECT @[email protected]
SELECT @PrintText=LEFT(@PrintText,LEN(@PrintText)-2) WHERE RIGHT(@PrintText,2) IN (CHAR(13)+CHAR(10), CHAR(10)+CHAR(13))
SELECT @PrintText=LEFT(@PrintText,LEN(@PrintText)-1) WHERE RIGHT(@PrintText,1) IN (CHAR(13),CHAR(10))
SELECT @PrintText=RIGHT(@PrintText,LEN(@PrintText)-1) WHERE LEFT(@PrintText,1) IN (CHAR(13),CHAR(10))
PRINT @PrintText

  

时间: 2024-10-04 07:30:42

SQL Server根据表或视图批量生成插入语句并BCP导出成文本的相关文章

sql server 系统表系统视图 及作用说明

sql server 系统视图,可分为: 目录视图   兼容性视图    动态管理视图和函数    信息架构视图    复制视图 系统表: sysaltfiles主数据库 保存数据库的文件 syscharsets主数据库字符集与排序顺序 sysconfigures主数据库 配置选项 syscurconfigs主数据库当前配置选项 sysdatabases主数据库服务器中的数据库 syslanguages主数据库语言 syslogins主数据库 登陆帐号信息 sysoledbusers主数据库 链

SQL Server修改表结构后批量更新所有视图

最近修改了数据库表结构,数据同步的时候出了问题,发现很多数据明明已经修改,但是通过视图筛选出来的还是原来的数据,所以怀疑应该是视图缓存了数据,在园子里找到下面的博文,在这里做个记录备忘. 原文链接:http://www.cnblogs.com/yashen/archive/2004/12/23/81000.html 我们在使用SqlServer时经常遇到这种情况,当修改某个表的结构后,相关的视图就不对了而导致程序错误,因此就有个下面这个存储过程. CREATE PROCEDURE Refresh

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

选中所在数据库 执行创建存储过程的sql CREATE proc [dbo].[spGenInsertSQL] (@tablename nvarchar(256),@sqlwhere varchar(4000)) as begin declare @sql varchar(max) declare @sqlValues varchar(max) set @sql =' (' set @sqlValues = 'values (''+' select @sqlValues = @sqlValues

SQL Server查看表结构及视图,适合开发者使用,简单易用

SELECT * FROM INFORMATION_SCHEMA.TABLES SELECT * FROM INFORMATION_SCHEMA.COLUMNS 查看执行结果 SQL Server查看表结构及视图,适合开发者使用,简单易用,布布扣,bubuko.com

SQL Server中中数据行批量插入脚本的存储实现

看到博友SQL Server MVP桦仔的一篇博文“将表里的数据批量生成INSERT语句的存储过程的实现”.我仔细看来博文中的两个存储代码,自我感觉两个都不太满意,都是生成的单行模式的插入,数据行稍微大些性能会受影响的.所在公司本来就存在第二个版本的类似实现,但是是基于多行模式的,还是需要手工添加UNAION ALL来满足多行模式的插入.看到这边博文和基于公司数据行批量脚本的存储的确定,这次改写和增强该存储的功能. 本存储运行于SQL Server 2005或以上版本,T-SQL代码如下: 1

SQL Server系统表sysobjects介绍与使用

原文:SQL Server系统表sysobjects介绍与使用 关于SQL Server数据库的一切信息都保存在它的系统表格里.我怀疑你是否花过比较多的时间来检查系统表格,因为你总是忙于用户表格.但是,你可能需要偶尔做一点不同寻常的事,例如数据库所有的触发器.你可以一个一个地检查表格,但是如果你有500个表格的话,这可能会消耗相当大的人工. 这就让sysobjects表格有了用武之地.虽然我不建议你更新这个表格,但是你当然有权对其进行审查. sysobjects 表 在数据库内创建的每个对象(约

sql server 复制表从一个数据库到另一个数据库

sql server 复制表从一个数据库到另一个数据库 /*不同服务器数据库之间的数据操作*/ --创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' --查询示例 select * from ITSV.数据库名.dbo.表名 --导入示例 select * into 表 f

SQL Server数据库表重置自增主键号(通常是指ID)

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

SQL Server索引 - 索引(物化)视图 <第九篇>

一.索引视图基本概念 索引视图实际上是一种将一组唯一值“物化”为群集索引形式的视图,所为物化就是几乎和表一样,其数据也是会存储一份的(会占用硬盘空间,但是查询速度快,例如可以将count(),sum()等值设在索引视图中).其优点是它在提取视图背后的信息方面提供了一个非常快的查找方法.在第一个索引(必须是针对一组唯一值的聚集索引)之后,通过使用来自第一个索引的聚集键作为参考点,SQL Server还能在视图上建立额外的索引.其限制如下: 视图必须使用SCHEMABINDING选项: 如果视图引用