日期:2014-05-18  浏览次数:20482 次

已有SQLSERVER表如何生成其代码?
已有SQLSERVER表如何生成其代码?

意思是说,一个表中已有数据,想求一种尽可能简单的方法,生成代码,代码一运行就能重新生成该表,包括其结构和其中的数据

只生成结构的话,我也会

可能是没有一下就完的方法,那么求尽可能方便快捷的方法!

------解决方案--------------------
SQL code
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'

------解决方案--------------------
SQL code

--只能生成insert 脚本
create procedure [dbo].[sp_generate_insert_script]
@tablename_mask varchar(30) = NULL
as
begin

declare @tablename varchar (128)
declare @tablename_max varchar (128)
declare @tableid int
declare @columncount numeric (7,0)
declare @columncount_max numeric (7,0)
declare @columnname varchar (30)
declare @columntype int
declare @string varchar (30)
declare @leftpart varchar (8000) /* 8000 is the longest string SQLSrv7 can EXECUTE */
dec