设为首页 收藏本站
查看: 974|回复: 0

[经验分享] SQL Server 2008 生成数据脚本

[复制链接]

尚未签到

发表于 2015-6-30 13:12:39 | 显示全部楼层 |阅读模式
SQL Server 2008 生成数据脚本

  存储过程
  

DSC0000.gif DSC0001.gif 代码


CREATE PROCEDURE dbo.UspOutputData
@tablename sysname
AS
declare @column varchar(1000)
declare @columndata varchar(1000)
declare @sql varchar(4000)
declare @xtype tinyint
declare @name sysname
declare @objectId int
declare @objectname sysname
declare @ident int
set nocount on
set @objectId=object_id(@tablename)
if @objectId is null -- 判斷對象是否存在
begin
print 'The object not exists'
return
end
set @objectname=rtrim(object_name(@objectId))
if @objectname is null or charindex(@objectname,@tablename)=0 --此判断不严密
begin
print 'object not in current database'
return
end
if OBJECTPROPERTY(@objectId,'IsTable') < > 1 -- 判斷對象是否是table
begin
print 'The object is not table'
return
end
select @ident=status&0x80 from syscolumns where id=@objectid and status&0x80=0x80
if @ident is not null
print 'SET IDENTITY_INSERT '+@TableName+' ON'
declare syscolumns_cursor cursor
for select c.name,c.xtype from syscolumns c
where c.id=@objectid
order by c.colid
open syscolumns_cursor
set @column=''
set @columndata=''
fetch next from syscolumns_cursor into @name,@xtype
while @@fetch_status < >-1
begin
if @@fetch_status < >-2
begin
if @xtype not in(189,34,35,99,98) --timestamp不需处理,image,text,ntext,sql_variant 暂时不处理
begin
set @column=@column+case when len(@column)=0 then'' else ','end+@name
set @columndata=@columndata+case when len(@columndata)=0 then '' else ','','','end
+case when @xtype in(167,175) then '''''''''+'+@name+'+''''''''' --varchar,char
when @xtype in(231,239) then '''N''''''+'+@name+'+''''''''' --nvarchar,nchar
when @xtype=61 then '''''''''+convert(char(23),'+@name+',121)+''''''''' --datetime
when @xtype=58 then '''''''''+convert(char(16),'+@name+',120)+''''''''' --smalldatetime
when @xtype=36 then '''''''''+convert(char(36),'+@name+')+''''''''' --uniqueidentifier
else @name end
end
end
fetch next from syscolumns_cursor into @name,@xtype
end
close syscolumns_cursor
deallocate syscolumns_cursor
set @sql='set nocount on select ''insert '+@tablename+'('+@column+') values(''as ''--'','+@columndata+','')'' from '+@tablename
print '--'+@sql
exec(@sql)
if @ident is not null
print 'SET IDENTITY_INSERT '+@TableName+' OFF'
GO
  
再通过 exec UspOutputData 表名 执行此存储过程会得到SQL 语句
如下图所示
DSC0002.png

  脚本如下
  insert Suppliers(SupplierId,SupplierName,SupplierType,Balance,Priority,Enable,MobileShangHai,MobileOther,UnicomShangHai,UnicomOther,TelecomShangHai,TelecomOther,MobileShangHai1,MobileOther1,UnicomShangHai1,UnicomOther1,TelecomShangHai1,TelecomOther1) values(     6       ,        N'蜗牛游戏'    ,        N'3' ,        0.00 ,        0       ,        1       ,        1       ,        1       ,        1       ,        1       ,        1       ,        1         ,        1       ,        1       ,        1       ,        1       ,        1       ,        1       )
  

  缺点和问题:
  得到导出数据的语句,但image,text,ntext,sql_variant 列不出现在语句
  

  另外 还可以通过SQL SERVER 本身的脚本来完成异出数据脚本功能,如下文文
  
  SQL Server数据导入导出工具BCP使用详解2009-06-05 上午 09:57BCP是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据。本文介绍如何利用BCP导入导出数据。
    BCP是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据。BCP可以将数据库的表或视图直接导出,也能通过SELECT FROM语句对表或视图进行过滤后导出。在导入导出数据时,可以使用默认值或是使用一个格式文件将文件中的数据导入到数据库或将数据库中的数据导出到文件中。
  
    下面将详细讨论如何利用BCP导入导出数据。
    1. BCP的主要参数介绍
    BCP共有四个动作可以选择。
    (1) 导入。
    这个动作使用in命令完成,后面跟需要导入的文件名。
    (2) 导出。
    这个动作使用out命令完成,后面跟需要导出的文件名。
    (3) 使用SQL语句导出。
    这个动作使用queryout命令完成,它跟out类似,只是数据源不是表或视图名,而是SQL语句。
  
    (4) 导出格式文件。
    这个动作使用format命令完成,后而跟格式文件名。
    下面介绍一些常用的选项:
    -f format_file
    format_file表示格式文件名。这个选项依赖于上述的动作,如果使用的是in或out,format_file表示已经存在的格式文件,如果使用的是format则表示是要生成的格式文件。
    -x
    这个选项要和-f format_file配合使用,以便生成xml格式的格式文件。
    -F first_row
    指定从被导出表的哪一行导出,或从被导入文件的哪一行导入。
    -L last_row
    指定被导出表要导到哪一行结束,或从被导入文件导数据时,导到哪一行结束。
    -c
    在使用密码登录时需要将-U后的用户名和-P后的密码加上双引号。
    注:BCP除了可以在控制台执行外,还可以通过调用SQL Server的一个系统存储过程xp_cmdshell以SQL语句的方式运行BCP。如上述第一条命令可改写为
    EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency out c:currency1.txt -c -U"sa" -P"password"'
    执行xp_cmdshell后,返回信息以表的形式输出。为了可以方便地在SQL中执行BCP,下面的命令都使用xp_cmdshell执行BCP命令。
    (2) 对要导出的表进行过滤。
    BCP不仅可以接受表名或视图名做为参数,也可以接受SQL做为参数。通过SQL语句可以对要导出的表进行过滤,然后导出过滤后的记录。
    EXEC master..xp_cmdshell 'BCP "SELECT TOP 20 * FROM AdventureWorks.sales.currency" queryout c:currency2.txt -c -U"sa" -P"password"'
    BCP还可以通过简单地设置选项对导出的行进行限制。
    EXEC master..xp_cmdshell 'BCP "SELECT TOP 20 * FROM AdventureWorks.sales.currency" queryout c:currency2.txt -F 10 -L 13 -c -U"sa" -P"password"'
    这条命令使用了两个参数-F 10和-L 13,表示从SELECT TOP 20 * FROM AdventureWorks.sales.currency所查出来的结果中取第10条到13条记录进行导出。
    3. 如何使用BCP导出格式文件
    BCP不仅可以根据表、视图导入导出数据,还可以配合格式文件对导入导出数据进行限制。格式文件以纯文本文件形式存在,分为一般格式和xml格式。用户可以手工编写格式文件,也可以通过BCP命令根据表、视图自动生成格式文件。
    EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency format nul -f c:currency_format1.fmt -c -T'
    上述命令将currency表的结构生成了一个格式文件currency_format1.fmt,下面是这个格式文件的内容。
    9.0
    3
    1 SQLCHAR 0 6 "  " 1 CurrencyCode SQL_Latin1_General_CP1_CI_AS
    2 SQLCHAR 0 100 "  " 2 Name SQL_Latin1_General_CP1_CI_AS
    3 SQLCHAR 0 24 " " 3 ModifiedDate
    这个格式文件记录了这个表的字段(共3个字段)类型、长度、字符和行分割符和字段名等信息。
    BCP还可以通过-x选项生成xml格式的格式文件。
    EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency format nul -f c:currency_format2.fmt -x -c -T'
    xml格式文件所描述的内容和普通格式文件所描述的内容完全一样,只是格式不同。
    4. 如何使用BCP导入数据
    BCP可以通过in命令将上面所导出的currency1.txt和currency2.txt再重新导入到数据库中,由于currency有主键,因此我们将复制一个和currency的结构完全一样的表。
    SELECT TOP 0 * INTO AdventureWorks.sales.currency1 FROM AdventureWorks.sales.currency
    将数据导入到currency1表中
    EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:currency1.txt -c -T'
    导入数据也同样可以使用-F和-L选项来选择导入数据的记录行。
    EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:currency1.txt -c -F 10 -L 13 -T'
    在导入数据时可以根据已经存在的格式文件将满足条件的记录导入到数据库中,不满足则不导入。如上述的格式文件中的第三个字段的字符长度是24,如果某个文本文件中的相应字段的长度超过24,则这条记录将不被导入到数据库中,其它满足条件的记录正常导入。
    使用普通的格式文件
    EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:currency1.txt -F 10 -L 13 -c -f c:currency_format1.fmt -T'
    使用xml格式的格式文件
    EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:currency1.txt -F 10 -L 13 -c -x -f c:currency_format2.fmt -T'
    总结
    BCP命令是SQL Server提供的一个快捷的数据导入导出工具。使用它不需要启动任何图形管理工具就能以高效的方式导入导出数据。当然,它也可以通过xp_cmdshell在SQL语句中执行,通过这种方式可以将其放到客户端程序中(如delphi、c#等)运行,这也是使客户端程序具有数据导入导出功能的方法之一。
    使用char类型做为存储类型,没有前缀且以"  "做为字段分割符,以" "做为行分割符。
    -w
    和-c类似,只是当使用Unicode字符集拷贝数据时使用,且以nchar做为存储类型。
    -t field_term
    指定字符分割符,默认是"  "。
    -r row_term
    指定行分割符,默认是" "。
    -S server_name[ instance_name]
    指定要连接的SQL Server服务器的实例,如果未指定此选项,BCP连接本机的SQL Server默认实例。如果要连接某台机器上的默认实例,只需要指定机器名即可。
    -U login_id
    指定连接SQL Sever的用户名。
    -P password
    指定连接SQL Server的用户名密码。
    -T 指定BCP使用信任连接登录SQL Server。如果未指定-T,必须指定-U和-P。
    -k 指定空列使用null值插入,而不是这列的默认值。
    2. 如何使用BCP导出数据
    (1) 使用BCP导出整个表或视图。
    BCP AdventureWorks.sales.currency out c:currency1.txt -c -U"sa" -P"password" --使用密码连接
    或
    BCP AdventureWorks.sales.currency out c:currency1.txt -c -T --使用信任连接
    下面是上述命令执行后的输出结果
    Starting copy...
    105 rows copied.
    Network packet size (bytes): 4096
    Clock Time (ms.) Total : 10 Average : (10500.00 rows per sec.)
    下面是currency1.txt的部分内容
    AED Emirati Dirham 1998-06-01 00:00:00.000
    AFA Afghani 1998-06-01 00:00:00.000
    ... ... ...
    ... ... ...
    ZWD Zimbabwe Dollar 1998-06-01 00:00:00.000
  
  在以上SQL 执行过程中,可能会出现如下提示到的问题
  SQL Server 阻止了对组件 'xp_cmdshell' 过程'sys.xp_cmdshell' 的访问
  解决办法 :
  -- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO
  
  
  其它参考文章
  http://www.iyunv.com/nonlyli/archive/2009/02/13/1390206.html
  http://www.iyunv.com/hardrock/archive/2005/12/16/298327.html 使用mygeneration生成脚本
  http://www.weste.net/2007/9-6/0949169547.html
  http://hi.baidu.com/yanzuoguang/blog/item/f5999cfb362bcd9f59ee90f2.html

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81950-1-1.html 上篇帖子: 使用SQL Server的reporting Service 下篇帖子: MS SQL Server store procedure Generator
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表