提取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
不要借助开发工具 怎么用过程嵌套的方法来获取内过程的信息呢。

...全文
601 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不能运行?

过程嵌套的方法来获取内过程的信息:解释一下
源码链接: https://pan.quark.cn/s/a4b39357ea24 微信小程序是由腾讯公司设计的一种轻量级应用开发平台,主要面向移动设备,旨在为用户带来无需下载安装即可直接使用的应用服务体验。在微信小程序的开发实践中,"模仿美团菜单 swiper分类菜单"是一项常见的技术应用,其目的是达成与美团外卖应用相似的交互模式,使用户能够轻松地浏览和挑选各种商品或服务。 在微信小程序的技术体系中,`swiper`组件属于轮播图功能模块,通常用于呈现多张图片或卡片式的切换界面,能够达成动态滑动展示不同分类菜单的功能。在模拟美团菜单的应用情境下,`swiper`组件一般与`swiper-item`组件协同工作,每一个`swiper-item`对应一个分类,用户可通过左右滑动来切换不同的分类菜单。 为了达成这样的功能,首先需要在微信小程序的`json`配置文档中引入`swiper`组件,并在`wxml`结构文档中构建相应的布局代码,将每个分类以`swiper-item`的形式进行组织。同时,需要在`wxss`样式文档中定义恰当的样式,保证分类菜单的视觉呈现符合设计规范。 接下来,我们将在`js`逻辑文档中处理`swiper`的切换逻辑,通过监听`bindchange`事件来识别当前选中的分类,并根据这一信息动态获取对应的子菜单信息。为了达成类似美团的层级菜单功能,可能还需要借助`picker`或`navigator`组件来展示二级分类或商品详情。 在开发阶段,需要关注以下关键点: 1. 数据绑定:保证数据与界面之间的双向链接准确无误,以便在选择分类时即时更新显示内容。 2. 动态加载:针对大量数据,可能需要采取异步加载机制,防止一次性加载过多内容引发性能瓶颈...
代码下载地址: https://pan.quark.cn/s/72bd50ecb2fb 《微信飞机大战素材详解》 微信飞机大战作为一款广受欢迎的休闲游戏,凭借其便捷的操作方式和紧张刺激的游戏过程,赢得了众多用户的青睐。本文将系统性地剖析这款游戏的关键素材,旨在帮助开发者全面掌握游戏的设计理念与实现方法。 我们聚焦于游戏的核心构成——"AirplaneResource"。此名称一般指向游戏资源库,其中收纳了游戏中所有的视觉素材、音频资料以及动画元素。在微信飞机大战的语境下,这些资源构成了游戏画面呈现、音效播放和动态效果的基础。 1. **图像素材**:游戏中的飞机造型、敌方单位、弹药以及爆炸效果等视觉元素,均以图像素材的形式进行展示。图像素材通常涵盖PNG或JPG格式的静态图片,也包括GIF或APNG格式的动态图片。开发者需要细致地设计并优化这些图像,确保在各种设备上都能实现流畅的渲染,同时维持视觉表现力。 2. **声音素材**:游戏的背景音乐、射击音效、爆炸声等音频片段,对于构建游戏氛围具有决定性作用。这些音频文件可能以MP3、WAV或OGG格式进行存储,开发者需要权衡音频的压缩程度与音质,以确保在不牺牲游戏体验的前提下,有效控制文件体积。 3. **动画序列**:飞机的飞行轨迹、攻击动作、爆炸过程等动态表现,通常借助序列帧动画技术实现。这些序列帧图片组合而成的动画,通过编程控制播放速率和顺序,为游戏增添生动的动态效果。 4. **物理接触判定**:游戏中飞机与弹药之间的接触判定,是通过算法完成的。开发者可能会采用基础的矩形接触判定或更精密的像素级接触判定,以保证游戏的公平性和挑战性。 5. **游戏规则**:微信飞机大战的得分机制、生命值系统、敌机生成逻辑等...

2,598

社区成员

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

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