分享

复制含主键的表结构的SQL

 照汗青 2010-09-26
create   procedure   up_getTableStruct   
 
@v_tableName   varchar(256)   
 
as   
 
declare   @i_objectId   int,   --   對象id   
  @i_indId   smallint,   --   索引id   
  @v_pkInfo   varchar(100),   --   主鍵信息   
  @v_clusteredInfo   varchar(20),   --   clustered信息   
  @v_pkCol   varchar(100),   --   主鍵字段   
  @v_key   varchar(50),   
 
@i_i   smallint   
 
set   @i_objectId   =   object_id(@v_tableName)   
 
if   @i_objectId   is   null   --   判斷對象是否存在   
  begin   
 
print   'The   object   not   exists'   
 
return   
 
end   
 
if   OBJECTPROPERTY(@i_objectId,'IsTable')   <>   1   --   判斷對象是否是table   
  begin   
 
print   'The   object   is   not   table'   
 
return   
 
end   
  
 
create   table   #temp1   
  (   
  i_id  
int   identity,   
  v_desc  
varchar(200)   
  )   
  
 
insert   into   #temp1(v_desc)   
 
values('create   table   '+@v_tableName+'(')   --   
  
 
insert   into   #temp1(v_desc)   --   將表的字段信息存入臨時表   
  select   a.name+space(4)+b.name+   
 
case   when   b.xtype   in   (167,175,231,239)   then   '('+cast(a.length   as   varchar)+')'   
 
when   b.xtype   in   (106,108)   then   '('+cast(a.xprec   as   varchar)+','+cast(a.xscale   as   varchar)+')'   
 
else   ''   end+space(4)+   
 
case   when   (a.colstat   &   1   =   1)   then   'identity('+cast(ident_seed(@v_tableName)   as   varchar)+','   +   
 
cast(ident_incr(@v_tableName)   as   varchar)+')'   else   ''   end   +space(4)+   
 
case   a.isnullable   when   0   then   'not   null'   else   'null'   end+'|'   
 
from   syscolumns   a,systypes   b   
 
where   a.id   =   @i_objectId   and   a.xtype   =   b.xusertype   
 
order   by   a.colid   
  
 
create   procedure   名 
 
@aa   varchar(10
 
as 
 
begin 
     
select   a.id   编号,a.name   名称,b.id,b.name   from   table1   a   join   table2   b   on   a.id=b.id   where   
 
end 
  
 
if   exists(select   1   from   sysobjects   where   parent_obj   =   @i_objectId   and   xtype   =   'PK')   --   如果存在主鍵   
  begin   
 
select   @v_pkInfo   =   b.name,@i_indId   =   indid,   --   得到主鍵名,id及是否clustered信息   
  @v_clusteredInfo   =   (case   when   (a.status   &   16)=16   then   'clustered'   else   'nonclustered'   end   )   
 
from   sysindexes   a,sysobjects   b   
 
where   a.id   =   b.parent_obj   and   a.name   =   b.name   and   b.xtype   =   'PK'   and   b.parent_obj   =   @i_objectId   
  
 
select   @v_pkCol   =   index_col(@v_tableName,   @i_indId,   1),   @i_i   =   2   --   得到主鍵的第1個字段名   
  select   @v_key   =   index_col(@v_tableName,   @i_indId,   @i_i)   --   得到主鍵的第2個字段名   
  while   (@v_key   is   not   null)   
 
begin   
 
select   @v_pkCol   =   @v_pkCol   +   ','   +   @v_key,   @i_i   =   @i_i   +   1   
 
select   @v_key   =   index_col(@v_tableName,   @i_indId,   @i_i)   --   得到主鍵的第@i_i個字段名   
  end   --   組合成主鍵信息   
  set   @v_pkInfo   =   'constraint   '+@v_pkInfo+'   primary   key   '+@v_clusteredInfo+'('+@v_pkCol+')'   
 
insert   into   #temp1(v_desc)   values(@v_pkInfo)   --   將主鍵信息插入臨時表   
  end   
 
else   
 
begin   
 
select   @i_i   =   count(1)   from   #temp1   
 
--   如果沒有主鍵,那麼將最後一筆紀錄的'|'去掉   
  update   #temp1   set   v_desc   =   replace(v_desc,'|','')   where   i_id   =   @i_i   
 
end   
  
 
insert   into   #temp1(v_desc)   values(')')   --   
  update   #temp1   set   v_desc   =   replace(v_desc,'|',',')   
  
 
select   v_desc   from   #temp1   order   by   i_id   
  
 
drop   table   #temp1

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多