下面的这个sp是数据库基础版的zhuzhichao(竹之草)斑竹以前写的一个sp. 用来抓取单个表的struct.我改了一下,用了一个cursor做了循环. 你生成该sp后直接运行就可以得到所有用户表的struct了. create procedure up_getTableStruct as declare @i_objectId int, -- 對象id @v_tableName varchar(256), -- table name @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) set nocount on create table #temp1 ( i_id int identity, v_desc varchar(200) ) declare mycursor cursor for select id,name from sysobjects where xtype = 'U' open mycursor fetch mycursor into @i_objectId,@v_tableName while (@@fetch_status=0) begin 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 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,'|',',') fetch mycursor into @i_objectId,@v_tableName end close mycursor DEALLOCATE mycursor select v_desc from #temp1 order by i_id drop table #temp1
用来抓取单个表的struct.我改了一下,用了一个cursor做了循环.
你生成该sp后直接运行就可以得到所有用户表的struct了.
create procedure up_getTableStruct
as
declare @i_objectId int, -- 對象id
@v_tableName varchar(256), -- table name
@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)
set nocount on
create table #temp1
(
i_id int identity,
v_desc varchar(200)
)
declare mycursor cursor for select id,name from sysobjects where xtype = 'U'
open mycursor
fetch mycursor into @i_objectId,@v_tableName
while (@@fetch_status=0)
begin
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 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,'|',',')
fetch mycursor into @i_objectId,@v_tableName
end
close mycursor
DEALLOCATE mycursor
select v_desc from #temp1 order by i_id drop table #temp1