提取sp_helpindex的内容到临时表

oO寒枫Oo 2011-09-01 05:11:59
exec sp_helpindex @objname=tab_user
这个是查询 tab_user表中所有的索引信息
我现在的想法是 想把exec查询出来的信息 插入到临时表中

create table #tmp_index
(
index_name varchar(50),
index_description varchar(500),
index_keys varchar(255),
index_max_row int,
index_fac int,
index_res int,
index_creation_time datetime
)
go
insert into #tmp_index(index_name,index_description,index_keys,index_max_row,index_fac,index_res,index_creation_time)
exec sp_helpindex @objname=eb_user
go
不要借助开发工具 怎么用过程嵌套的方法来获取内过程的信息呢。

...全文
478 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
oO寒枫Oo 2011-09-20
  • 打赏
  • 举报
回复
对了,问题基本上已经解决了
给大家分享一下:(有空大家可以帮我查看下有什么漏洞)

create procedure [%QUALIFIER%]%PROC%
@objname varchar(100),
@condition_name varchar(1000),
@is_bak varchar(1)
as
declare @start_time datetime
declare @end_time datetime
declare @indid int
declare @keys varchar(1024)
declare @msg varchar(1024)
declare @create_tmp_str varchar(1024)
declare @lock_datarows_str varchar(100)
declare @pk_str varchar(1024)
declare @start_str varchar(100)
declare @default_str varchar(1024)
declare @index_str varchar(1024)
declare @grant_str varchar(1024)
declare @ddl_str varchar(1024)
declare @rename_str varchar(1024)
declare @end_str varchar(100)
declare @column_name varchar(1024)
declare @default_name varchar(1024)
declare @new_id char(32)
declare @data_str varchar(10)
begin
set nocount on
set @start_time=getdate()
set @data_str=right(convert(varchar(10),getdate(),112),4)
select @new_id =newid()
insert into dba_delete_history_data
select @new_id,@objname,@start_time,null,0

set @start_str =@objname+' data cleaning start......'
print @start_str

set @create_tmp_str='select * into '+@objname+'_tmp from '+@objname+' '+@condition_name
exec (@create_tmp_str)

if @@error != 0
return -1
set @lock_datarows_str='alter table '+@objname+'_tmp lock datarows'
exec (@lock_datarows_str)


create table #temp
(
id int identity,
column_name varchar(200),
default_name varchar(200)
)
declare @n int
declare @rows int
select @n=1
insert #temp(column_name,default_name)
select C.name,D.text
from syscomments D,sysprocedures P ,syscolumns C,sysobjects O
where D.id = C.cdefault and P.id=D.id and C.id=O.id and O.type='U' and O.name=@objname
and P.sequence=0 and P.status & 4096 =4096
select @rows = @@rowcount
while @n <= @rows
begin

select @default_str ='alter table '+@objname+'_tmp replace '+column_name+' '+default_name
from #temp where id = @n
exec (@default_str)
select @n = @n + 1
end
drop table #temp


if @@trancount = 0
begin set chained off end
set transaction isolation level 1
if @objname like "%.%.%" and substring(@objname, 1, charindex(".", @objname) - 1) != db_name()
begin raiserror 17460 end
if not exists (select id from sysobjects where id = object_id(@objname))
begin raiserror 17461 end
select @indid = min(indid)
from sysindexes where id = object_id(@objname) and indid > 0 and indid < 255
if @indid is NULL
begin
exec sp_getmessage 17640, @msg output
print @msg
end
while @indid is not NULL
begin
declare @i int
declare @thiskey varchar(30)
declare @sorder char(4)
declare @lastindid int
select @keys = "", @i = 1

while @i <= 31
begin
select @thiskey = index_col(@objname, @indid, @i)
if (@thiskey is NULL)
begin
goto keysdone
end
if @i > 1
begin
select @keys = @keys + ", "
end
select @keys = @keys + @thiskey
select @sorder = index_colorder(@objname, @indid, @i)
if (@sorder = "DESC")
select @keys = @keys + " " + @sorder
select @i = @i + 1
end
keysdone:
print '-----------------------------------------------------'
if exists(select 1 from sysindexes where id = object_id(@objname) and indid = @indid and status & 2048 = 2048)
begin
select @pk_str='alter table '+@objname+'_tmp add constraint '+name+' primary key nonclustered ('+@keys+')'
from sysindexes where id = object_id(@objname) and indid = @indid and status & 2048 = 2048
exec (@pk_str)
end
if exists(select 1 from sysindexes where id = object_id(@objname) and indid = @indid and status & 2048 <> 2048)
begin
select @index_str='create index '+name+' on '+@objname+'_tmp('+@keys+')'
from sysindexes where id = object_id(@objname) and indid = @indid and status & 2048 <> 2048
exec (@index_str)
end
select @lastindid = @indid
select @indid = NULL
select @indid = min(indid) from sysindexes where id = object_id(@objname) and indid > @lastindid and indid < 255
end

set @grant_str='grant select,insert,delete,update on '+@objname+'_tmp to web'
exec (@grant_str)
set @grant_str='grant select,insert,delete,update on '+@objname+'_tmp to sms'
exec (@grant_str)

if(lower(@is_bak)='y')
begin
set @rename_str='exec sp_rename '+@objname+','+@objname+'_'+@data_str
exec (@rename_str)
set @rename_str=''
end
if(lower(@is_bak)='n')
begin
set @ddl_str='truncate table '+@objname
exec (@ddl_str)
set @ddl_str='drop table '+@objname
exec (@ddl_str)
end

set @rename_str='exec sp_rename '+@objname+'_tmp,'+@objname
exec (@rename_str)

set @end_str=@objname+' data cleaning complete!'
print @end_str
set @end_time=getdate()
update dba_delete_history_data
set status=1,end_time=@end_time
where id=@new_id
set nocount off
end
go

sp_procxmode up_delete_history_table, anymode
go

oO寒枫Oo 2011-09-03
  • 打赏
  • 举报
回复
谢谢2位 结贴了 貌似最高只有100分 每人50了 呵呵。
oO寒枫Oo 2011-09-02
  • 打赏
  • 举报
回复
嗯 多谢了 7楼 你的博文写得不错
我现在的需求是 根据表名提取表的 索引信息 约束信息
然后自动的生成表重构的脚本

因为表的数据量大 需要经常的进行历史纪录的清理

因为现在很多地区的表结构有不是相同的 所以这种清理的脚本不能是静态的 所以现在我想通过系统的过程
或者数据字典等信息 来重构一张tem_user表 由于 select into 只能生成数据信息 那些索引啊 约束 必须得重构 所以才产生了上面的问题。
目前我有了一个想法 就是根据2楼说的 直接运用系统过程取信息的办法 来获取这些我所需要的索引名 索引列名等信息。 进而达到重构数据表的目的。
  • 打赏
  • 举报
回复
就是根据2楼说的 直接运用系统过程取信息的办法 来获取这些我所需要的索引名 索引列名等信息。 进而达到重构数据表的目的。

你可以。
直接参考sp_helpindex的实现思路即可。 我那篇博文的思路是利用存储过程的结果。 你可以直接用sql来实现类似存储过程的功能。
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lxpbs8851 的回复:]

引用 6 楼 andkylee 的回复:

insert into #tmp_index(index_name,index_description,index_keys,index_max_row,index_fac,index_res,index_creation_time)
exec sp_helpindex @objname=eb_user
在sqlserver是可以的, 而在sy……
[/Quote]

参考我的博文:ASE15.0中利用代理表实现统计用户表存储空间大小的功能
http://www.dbainfo.net/sybase-ase15-compute-table-space-by-proxy-procedure-proxy_table.htm

或许能给你提供一些思路。
oO寒枫Oo 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 andkylee 的回复:]

insert into #tmp_index(index_name,index_description,index_keys,index_max_row,index_fac,index_res,index_creation_time)
exec sp_helpindex @objname=eb_user
在sqlserver是可以的, 而在sybase ase中是不行的。
[/Quote]
嗯 是的 MSSQL是可以的
  • 打赏
  • 举报
回复
insert into #tmp_index(index_name,index_description,index_keys,index_max_row,index_fac,index_res,index_creation_time)
exec sp_helpindex @objname=eb_user
在sqlserver是可以的, 而在sybase ase中是不行的。
oO寒枫Oo 2011-09-01
  • 打赏
  • 举报
回复
好的 我去看看他的代码 多谢你
oO寒枫Oo 2011-09-01
  • 打赏
  • 举报
回复
主要目的就是要把
exec sp_helpindex @objname=eb_user
查出来的 index_name index_keys 信息取出来
oO寒枫Oo 2011-09-01
  • 打赏
  • 举报
回复
SYBASE的版本是12.5
就是执行
insert into #tmp_index(index_name,index_description,index_keys,index_max_row,index_fac,index_res,index_creation_time)
exec sp_helpindex @objname=eb_user

的时候无法插入 我记得mssql是可以的
wwwwb 2011-09-01
  • 打赏
  • 举报
回复
sp_helpindex是系统SP,可以看看其代码
sp_helptext 'sp_helpindex'
wwwwb 2011-09-01
  • 打赏
  • 举报
回复
SYBASE什么版本?SQL不能运行?

过程嵌套的方法来获取内过程的信息:解释一下

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧