zoukankan      html  css  js  c++  java
  • 黄聪:SQL Server 开发之 复制表数据的SQL脚本生成器

     SQL Server 开发之 复制表数据的SQL脚本生成器收藏

    使用SQL Server 2000自带的“生成SQL脚本”工具,可以生成创建表、视图、存储过程等的SQL脚本。那么,能否将表中的数据也生成为SQL脚本,在查询分析器中执行这些脚本后自动将数据导入到SQL Server中呢?答案是肯定的。

    下面的存储过程是一位高人写的,这位高人的姓氏已无人知晓,但SQL Server社区中偶尔还可看到此不朽之作。

    代码
    CREATE PROCEDURE dbo.OutputData
    @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 @tablename + '对象不存在'
    return
    end

    set @objectname=rtrim(object_name(@objectId))
    if @objectname is null or charindex(@objectname,@tablename)=0
    begin
    print @tablename + '对象不在当前数据库中'
    return
    end

    if OBJECTPROPERTY(@objectId,'IsTable') < > 1 -- 判断对象是否是表
    begin
    print @tablename + '对象不是表'
    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'



    --定义游标,循环取数据并生成Insert语句
    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'

    调用时 exec   OutputData   'myuser' 其中myUser中当前数据库中存在的表

       

  • 相关阅读:
    Android ListView和CheckBox应用之批量删除操作(附带源码)
    Spring3 MVC 3到Spring MVC框架简介
    Struts2.3 + Spring3.1 + Hibernate3.6 + HTML5 + CSS3整合开发
    Java和MongoDB之Hello World
    SQL Server 2008中的hierarchyid
    SQLSERVER复制表的方法
    去掉struts2标签的样式
    KineticJS教程(12)
    SQL Server日期时间格式转换字符串详解
    生活不易,且行且珍惜!
  • 原文地址:https://www.cnblogs.com/huangcong/p/1900339.html
Copyright © 2011-2022 走看看