查看数据字典

在网上搜集了一个查询数据字典的脚本语句,但是在执行的时候发现查出来的结果不是我想要的结果,故此针对脚本进行了一定的修改后才得到我所需要的。

说明:
        脚本1 是网上收集到的脚本
       脚本2 是在此脚本上进行的修改后的结果
    
问题原因:
        脚本1 在如果只有一个主键而没有其他索引的情况下是正确的,但是在实际的情况下,一个表一般都有多个索引存在的,因此获取到的数据字典中,只要该字段在对应的索引中,则该字段就会标识为主键字段。
    
问题解决:
        在以上的问题中,进行了脚本的修改,从而得到我想要的结果。修改的关键点就在于,查询索引的时候只关联主键所对应的索引名称

具体的详情可以看以下的运行结果

--第一种方法
SELECT 所有者   = OBJECT_SCHEMA_NAME(D.ID),
       表名     = D.NAME, 
       字段名   = A.NAME , 
       标识列   = (CASE WHEN COLUMNPROPERTY(A.ID, A.NAME, 'IsIdentity') = 1 THEN 1 ELSE 0 END), 
       是否主键 = CASE WHEN EXISTS(SELECT 1 FROM SYSOBJECTS WHERE XTYPE = 'PK' AND NAME IN ( 
                                      SELECT NAME FROM SYSINDEXES WHERE INDID IN ( 
                                         SELECT INDID FROM SYSINDEXKEYS WHERE ID = A.ID AND COLID = A.COLID))) THEN '√' 
                       ELSE '' END, 
       字段类型 = TYPE_NAME(A.XUSERTYPE), 
       长度     = COLUMNPROPERTY(A.ID, A.NAME, 'PRECISION')  , 
       小数位   = ISNULL(COLUMNPROPERTY(A.ID, A.NAME, 'Scale'), 0), 
       可为空   =(CASE WHEN A.ISNULLABLE = 1 THEN 1 ELSE 0 END), 
       默认值   = ISNULL(E.TEXT, '') 
 FROM SYSCOLUMNS A 
      INNER JOIN SYSOBJECTS D ON A.ID=D.ID AND D.XTYPE='U' AND D.NAME LIKE '%' 
      LEFT JOIN SYSCOMMENTS E ON A.CDEFAULT = E.ID 
 WHERE D.NAME = 'ContactType'
 ORDER BY D.NAME, A.COLORDER
/*
所有者     表名           字段名           标识列   是否主键  字段类型     长度        小数位      可为空      默认值      
---------  -------------- ---------------- -------- --------- ------------ ----------- ----------- ----------- -------------
Person     ContactType    ContactTypeID    1        √         int          10          0           0                       
Person     ContactType    Name             0        √         Name         50          0           0                       
Person     ContactType    ModifiedDate     0                  datetime     23          3           0           (getdate()) 

(3 行受影响)
*/


--第二种方法
SELECT 所有者   = OBJECT_SCHEMA_NAME(D.ID),
       表名     = D.NAME, 
       字段名   = A.NAME , 
       标识列   = (CASE WHEN COLUMNPROPERTY(A.ID, A.NAME, 'IsIdentity') = 1 THEN 1 ELSE 0 END), 
       是否主键 =  CASE WHEN EXISTS(SELECT X1.NAME AS PKNAME, X4.NAME AS TBLNAME, X3.NAME AS COLNAME
                                    FROM SYSINDEXES X1, SYSINDEXKEYS X2, SYSCOLUMNS X3, SYSOBJECTS X4, SYSOBJECTS X5
                                    WHERE X1.INDID=X2.INDID AND X1.ID=X2.ID AND X1.ID=X3.ID AND X3.ID=X4.ID AND X2.COLID=X3.COLID 
                                      AND X1.NAME=X5.NAME AND X5.XTYPE='PK' AND X4.NAME=D.NAME AND X3.NAME=A.NAME
                           ) THEN '√' 
                        ELSE '' END, 
       字段类型 = TYPE_NAME(A.XUSERTYPE), 
       长度     = COLUMNPROPERTY(A.ID, A.NAME, 'PRECISION')  , 
       小数位   = ISNULL(COLUMNPROPERTY(A.ID, A.NAME, 'Scale'), 0), 
       可为空   =(CASE WHEN A.ISNULLABLE = 1 THEN 1 ELSE 0 END), 
       默认值   = ISNULL(E.TEXT, '') 
 FROM SYSCOLUMNS A 
      INNER JOIN SYSOBJECTS D ON A.ID=D.ID AND D.XTYPE='U' AND D.NAME LIKE '%' 
      LEFT JOIN SYSCOMMENTS E ON A.CDEFAULT = E.ID 
 WHERE D.NAME = 'ContactType'
 ORDER BY D.NAME, A.COLORDER
/*
所有者     表名           字段名           标识列   是否主键  字段类型     长度        小数位      可为空      默认值      
---------  -------------- ---------------- -------- --------- ------------ ----------- ----------- ----------- -------------
Person     ContactType    ContactTypeID    1        √         int          10          0           0                       
Person     ContactType    Name             0                  Name         50          0           0                       
Person     ContactType    ModifiedDate     0                  datetime     23          3           0           (getdate()) 

(3 行受影响)
*/


--查看该表的索引
SELECT NAME FROM SYS.sysindexes  WHERE OBJECT_NAME(ID) = 'ContactType'
/*
NAME
------------------------------------
AK_ContactType_Name
PK_ContactType_ContactTypeID

(2 行受影响)
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值