• 最近公司换成sqlserver数据库;经常需要把表数据转化成插入语句,可用如下语句


    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 'TA_TPREPRODUCT'

    -- 

  • 相关阅读:
    Max Sum(经典DP)
    Codeforces Round #166 (Div. 2)D. Good Substrings(字符串散列)
    Edge(简单)
    Just a Hook(线段树,成段更新)
    Codeforces Round #169 (Div. 2) D. Little Girl and Maximum XOR(贪心,中等)
    最大连续子序列(经典DP)
    Compromise(求解最长公共子序列并输出)
    如何查看IE型号
    并查集中Sfind函数的返回值错误,伤了我两天~!
    最大流的非递归Dinic算法
  • 原文地址:https://www.cnblogs.com/cc233/p/12714665.html
Copyright © 2020-2023  润新知