生成建表语句

create procedure SP_GET_TABLE_INFO @ObjName varchar(128)       /* The table to generate sql script */
as
declare @Script varchar(255)
declare @ColName varchar(30)
declare @ColID TinyInt
declare @UserType smallint
declare @TypeName sysname
declare @Length smallint
declare @Prec smallint
declare @Scale smallint
declare @Status smallint
declare @cDefault int
declare @DefaultID smallint
declare @Const_Key varchar(255)
declare @IndID SmallInt 
declare @IndStatus Int
declare @Index_Key varchar(255)
declare @DBName varchar(30)
declare @strPri_Key varchar(255)

/*
**  Check to see the the table exists and initialize @objid.
*/
if not Exists ( Select name
                  from sysobjects
                  where name=@ObjName )
  begin
    select @DBName=db_name()
    raiserror(15009,-1,-1,@ObjName,@DBName)
    return (1)
  end

create table #spscript
(
 id int IDENTITY
        not null,
 Script Varchar(255) NOT NULL,
 LastLine tinyint
)

declare Cursor_Column INSENSITIVE CURSOR
for
Select a.name,a.ColID,a.usertype,b.name,a.length,a.prec,a.scale,a.Status,
    a.cDefault,
    case a.cdefault
      when 0 then ' '
      else (
            select c.Text from syscomments c where a.cdefault = c.id
           )
    end const_key
  from syscolumns a,
    systypes b
  where object_name(a.id)=@ObjName
    and a.usertype=b.usertype
  order by a.ColID

set nocount on
Select @Script='Create table '+@ObjName+'('
Insert into #spscript
  values (@Script,0)

/* Get column information */
open Cursor_Column

fetch next from Cursor_Column into @ColName,@ColID,@UserType,@TypeName,@Length,
  @Prec,@Scale,@Status,@cDefault,@Const_Key

Select @Script=''
while (@@FETCH_STATUS<>-1)
  begin
    if (@@FETCH_STATUS<>-2)
      begin
        Select @Script=@ColName+' '+@TypeName
        if @UserType in (1,2,3,4)
          Select @Script=@Script+'('+Convert(char(3),@Length)+') '
        else
          if @UserType in (24)
            Select @Script=@Script+'('+Convert(char(3),@Prec)+','
                +Convert(char(3),@Scale)+') '
          else
            Select @Script=@Script+' '
        if (@Status&0x80)>0
          Select @Script=@Script+' IDENTITY(1,1) '

        if (@Status&0x08)>0
          Select @Script=@Script+' NULL '
        else
          Select @Script=@Script+' NOT NULL '
        if @cDefault>0
          Select @Script=@Script+' DEFAULT '+@Const_Key
      end
    fetch next from Cursor_Column into @ColName,@ColID,@UserType,@TypeName,
      @Length,@Prec,@Scale,@Status,@cDefault,@Const_Key
    if @@FETCH_STATUS=0
      begin
        Select @Script=@Script+','
        Insert into #spscript
          values (@Script,0)
      end
    else
      begin
        Insert into #spscript
          values (@Script,1)
        Insert into #spscript
          values (')',0)
      end
  end
Close Cursor_Column
Deallocate Cursor_Column

/* Get index information */
Declare Cursor_Index INSENSITIVE CURSOR
for
Select name,IndID,status
  from sysindexes
  where object_name(id)=@ObjName
    and IndID>0
    and IndID<>255
  order by IndID   /*增加了对InDid为255的判断*/
Open Cursor_Index
Fetch Next from Cursor_Index into @ColName,@IndID,@IndStatus
while (@@FETCH_STATUS<>-1)
  begin
    if @@FETCH_STATUS<>-2
      begin

        declare @i TinyInt
        declare @thiskey varchar(50)
        declare @IndDesc varchar(68) /* string to build up index desc in */

        Select  @i=1
        while (@i<=16)
          begin
            select @thiskey=index_col(@ObjName,@IndID,@i)
            if @thiskey is null
              break

            if @i=1
              select @Index_Key=index_col(@ObjName,@IndID,@i)
            else
              select @Index_Key=@Index_Key+', '+index_col(@ObjName,@IndID,@i)
            select @i=@i+1
          end
        if (@IndStatus&0x02)>0
          Select @Script='Create unique '
        else
          Select @Script='Create '
        if @IndID=1
          select @Script=@Script+' clustered '


        if (@IndStatus&0x800)>0
          select @strPri_Key=' PRIMARY KEY ('+@Index_Key+')'
        else
          select @strPri_Key=''
    
        if @IndID>1
          select @Script=@Script+' nonclustered '
        Select @Script=@Script+' index '+@ColName+' ON '+@ObjName+'('
            +@Index_Key+')'
        Select @IndDesc=''
    /*
 **  See if the index is ignore_dupkey (0x01).
    */
        if @IndStatus&0x01=0x01
          Select @IndDesc=@IndDesc+' IGNORE_DUP_KEY'+','
    /*
     **  See if the index is ignore_dup_row (0x04).
    */
   /* if @IndStatus & 0x04 = 0x04 */
   /*   Select @IndDesc = @IndDesc + ' IGNORE_DUP_ROW' + ',' */ /* 2000 不在支持*/
    /*
 **  See if the index is allow_dup_row (0x40).
    */
        if @IndStatus&0x40=0x40
          Select @IndDesc=@IndDesc+' ALLOW_DUP_ROW'+','
        if @IndDesc<>''
          begin
            Select @IndDesc=SubString(@IndDesc,1,DataLength(@IndDesc)-1)
            Select @Script=@Script+' WITH '+@IndDesc
          end
    /*
 **  Add the location of the data.
    */
      end
    if (@strPri_Key='')
      Insert into #spscript
        values (@Script,0)
    else
      update #spscript
        set Script=Script+@strPri_Key
        where LastLine=1
 
    Fetch Next from Cursor_Index into @ColName,@IndID,@IndStatus
  end
Close Cursor_Index
Deallocate Cursor_Index

Select Script
  from #spscript

set nocount off

return (0)

SP_GET_TABLE_INFO 'student'

原文地址:https://www.cnblogs.com/qanholas/p/2499318.html