免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8735 | 回复: 12
打印 上一主题 下一主题

Sybase ASE中实现类似oracle的sqlplus中desc命令来简要显示表结构的存储过程 [复制链接]

论坛徽章:
6
水瓶座
日期:2014-06-04 03:34:37水瓶座
日期:2014-06-17 13:20:31数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-17 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-06 10:40 |只看该作者 |倒序浏览
在oracle的sqlplus中有一个命令:desc,能够简要的显示基表、视图等的结构。desc的显示结果简单明了,比较实用。虽然在 Sybase ASE中的存储过程sp_help也能实现查看表结构的目的;但是,显示结果很多尤其换行混乱,让人看得眼花缭乱。显示的存储过程:sp_desc能够实现oracle的sqlplus中desc相同的功能,仅仅多了一列:列序号。

效果图如下:


存储过程sp_desc的语法如下:

——=================================================================================

use sybsystemprocs
go

if exists(select 1 from sybsystemprocs.dbo.sysobjects where type="P" and name="sp_desc")
  drop proc sp_desc
go

create procedure sp_desc
    @tablename varchar(128)
as
    declare @table_id int
    declare @char_bin_types   varchar(30)
    set nocount on
begin   
    select @char_bin_types = char(47)+char(39)+char(45)+char(37)+char(35)+char(34)
    select @table_id = object_id(@tablename)
   
    select
    "序号"=convert(varchar(3),colid),
    "列名"=convert(varchar(30),column_name),
    "是否为空?"=convert(varchar(7),nullable),
    "类型"=convert(varchar(30),
          (case scale
                      when NULL then
                          case
                          when charindex(type_name,",ubigint,tinyint,usmallint,uintn,floatn,smallmoneyn,daten,timen,real,bit,sysname,text,image,smalldatetime,real,longsysname,timestamp,datetimn") > 0 then type_name
                          else
                              type_name+"("+convert(varchar,precision)+")"
                          end
                        
                      when 0 then
                          case
                          when charindex(type_name,",ubigint,tinyint,usmallint,uintn,floatn,smallmoneyn,daten,timen,real,bit,sysname,text,image,smalldatetime,real,longsysname,timestamp,datetimn") > 0 then type_name
                          else
                              type_name+"("+convert(varchar,precision)+","+convert(varchar,scale)+")"
                          end
                      else
                          case
                          when charindex(type_name,",ubigint,tinyint,usmallint,uintn,floatn,smallmoneyn,daten,timen,real,bit,sysname,text,image,smalldatetime,real,longsysname,timestamp,datetimn") > 0 then type_name
                          else
                              type_name+"("+convert(varchar,precision)+","+convert(varchar,scale)+")"
                          end
                      end
           )
      )
    from
    (   
    SELECT    /* INTn, FLOATn, DATETIMEn and MONEYn types */
            colid = c.colid,
            column_name = c.name,
            nullable =    /* set nullability from status flag */
                (case convert(smallint, convert(bit, c.status&8)) when 0 then "NOT NULL" else "" end),                  
            type_name = rtrim(substring(isnull(stuff(d.type_name,
                    (c.status&128)/128,
                    char_length(d.type_name),
                    "numeric identity"), d.type_name),
                    1+isnull(d.aux,
                    ascii(substring("III<<<MMMI<<A<A",
                    2*(d.ss_dtype%35+1)+2-8/c.length,
                    1))-60), 18)),
            "precision" = isnull(convert(int, c.prec),
                         isnull(convert(int, d.data_precision),
                        convert(int,c.length)))
                    +isnull(d.aux, convert(int,
                    ascii(substring("???AAAFFFCKFOLS",
                    2*(d.ss_dtype%35+1)+2-8/c.length,1))-60)),
        scale = isnull(convert(smallint, c.scale),
                       convert(smallint, d.numeric_scale))
                    +convert(smallint,
                    isnull(d.aux,
                    ascii(substring("<<<<<<<<<<<<<<?",
                    2*(d.ss_dtype%35+1)+2-8/c.length,
                    1))-60))
        FROM
            syscolumns c,
            sysobjects o,
            sybsystemprocs.dbo.spt_datatype_info d,
            systypes t
        WHERE
            o.id = @table_id
            AND c.id = o.id
            AND c.usertype = t.usertype
            AND t.type = d.ss_dtype
            AND d.ss_dtype IN (111, 109, 38, 110, 43)    /* Just *N types */
            AND c.usertype < 100        /* No user defined types */
        UNION
        SELECT    /* All other types including user data types */
            colid = c.colid,
            column_name = c.name,
            nullable =    /* set nullability from status flag */
                (case convert(smallint, convert(bit, c.status&8)) when 0 then "NOT NULL" else "" end),
            type_name = rtrim(substring(isnull(stuff(d.type_name,
                    (c.status&128)/128,
                    char_length(d.type_name),
                    "numeric identity"), d.type_name),
                    1+isnull(d.aux,
                    ascii(substring("III<<<MMMI<<A<A",
                    2*(d.ss_dtype%35+1)+2-8/c.length,
                    1))-60), 18)),
            "precision" = isnull(convert(int, c.prec),
                     isnull(convert(int, d.data_precision),
                    convert(int,c.length)))
                    +isnull(d.aux, convert(int,
                    ascii(substring("???AAAFFFCKFOLS",
                    2*(d.ss_dtype%35+1)+2-8/c.length,1))-60)),
            scale = isnull(convert(smallint, c.scale),
                       convert(smallint, d.numeric_scale)) +
                    convert(smallint, isnull(d.aux,
                    ascii(substring("<<<<<<<<<<<<<<?",
                    2*(d.ss_dtype%35+1)+2-8/c.length,
                    1))-60))
        FROM
            syscolumns c,
            sysobjects o,
            sybsystemprocs.dbo.spt_datatype_info d,
            systypes t
        WHERE
            o.id = @table_id
            AND c.id = o.id
            AND c.usertype = t.usertype
            AND t.type = d.ss_dtype
            AND (d.ss_dtype NOT IN (111, 109, 38, 110, 43) /* No *N types */
                OR c.usertype >= 100) /* User defined types */
    ) a
    ORDER BY colid
end
go

——=================================================================================

存储过程sp_desc的语法请 :下载

论坛徽章:
33
ChinaUnix元老
日期:2018-07-04 15:10:362015年亚洲杯之阿联酋
日期:2015-02-06 17:15:532015亚冠之武里南联
日期:2015-06-06 15:40:252015亚冠之北京国安
日期:2015-06-17 15:42:412022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:322015亚冠之阿尔纳斯尔
日期:2015-09-20 09:42:1215-16赛季CBA联赛之北京
日期:2016-01-15 10:03:5915-16赛季CBA联赛之青岛
日期:2016-04-26 16:44:4915-16赛季CBA联赛之广夏
日期:2018-07-04 15:33:21C
日期:2016-10-25 16:12:142017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之同曦
日期:2017-02-22 22:41:10
2 [报告]
发表于 2010-11-06 13:16 |只看该作者
你最近可是在SYBASE这个版块花了力气了

论坛徽章:
6
水瓶座
日期:2014-06-04 03:34:37水瓶座
日期:2014-06-17 13:20:31数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-17 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2010-11-06 15:37 |只看该作者
回复 2# wfcjz


       个人原创,非转帖~~~

论坛徽章:
33
ChinaUnix元老
日期:2018-07-04 15:10:362015年亚洲杯之阿联酋
日期:2015-02-06 17:15:532015亚冠之武里南联
日期:2015-06-06 15:40:252015亚冠之北京国安
日期:2015-06-17 15:42:412022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:322015亚冠之阿尔纳斯尔
日期:2015-09-20 09:42:1215-16赛季CBA联赛之北京
日期:2016-01-15 10:03:5915-16赛季CBA联赛之青岛
日期:2016-04-26 16:44:4915-16赛季CBA联赛之广夏
日期:2018-07-04 15:33:21C
日期:2016-10-25 16:12:142017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之同曦
日期:2017-02-22 22:41:10
4 [报告]
发表于 2010-11-06 16:51 |只看该作者
兄弟,没说你是转的贴子呀!这是对你工作和对CU热情的肯定。

好好努力!

论坛徽章:
0
5 [报告]
发表于 2010-11-08 13:17 |只看该作者
hahha
一开始接触sybase 就看到了andkylee
很感谢啊

论坛徽章:
6
水瓶座
日期:2014-06-04 03:34:37水瓶座
日期:2014-06-17 13:20:31数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-17 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2010-11-08 14:58 |只看该作者
回复 5# piml_lv


    客气了。 共享一下而已。

论坛徽章:
0
7 [报告]
发表于 2010-12-06 22:44 |只看该作者
晕死!

脚本出错!无法执行!




Msg 156, Level 15, State 2
Incorrect syntax near the keyword 'SELECT'.
Msg 102, Level 15, State 1
Incorrect syntax near ')'.

论坛徽章:
6
水瓶座
日期:2014-06-04 03:34:37水瓶座
日期:2014-06-17 13:20:31数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-17 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
8 [报告]
发表于 2010-12-07 09:21 |只看该作者
回复 7# yakcy


    我测试没有问题的。 从帖子上拷贝还是下载sql文件都是没问题的。
在utf8-nocase下测试过。

注意您的ASE的字符集。

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-09 06:20:00数据库技术版块每日发帖之星
日期:2015-11-03 06:20:00数据库技术版块每日发帖之星
日期:2016-02-20 06:20:00数据库技术版块每日发帖之星
日期:2016-07-13 06:20:00数据库技术版块每日发帖之星
日期:2016-07-31 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
9 [报告]
发表于 2010-12-07 11:04 |只看该作者
作得漂亮,赞一下。
提点改进建议:
select a.name as name,b.name as type,a.length as length ,a.type as flg ,a.prec as prec,a.scale as scale ,a.status as status, c.text as deftext
from syscolumns a,systypes b,syscomments c
where a.usertype=b.usertype and  a.id=object_id('"+tablename+"') and a.cdefault*=c.id
order by a.colid

联立取一下table中的column中的default表达式。

论坛徽章:
6
水瓶座
日期:2014-06-04 03:34:37水瓶座
日期:2014-06-17 13:20:31数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-17 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
10 [报告]
发表于 2010-12-07 14:06 |只看该作者
回复 9# Eisen


    恩,这个建议不错。 谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP