在网上搜集了一个查询数据字典的脚本语句,但是在执行的时候发现查出来的结果不是我想要的结果,故此针对脚本进行了一定的修改后才得到我所需要的。
说明:
脚本1 是网上收集到的脚本
脚本2 是在此脚本上进行的修改后的结果
问题原因:
脚本1 在如果只有一个主键而没有其他索引的情况下是正确的,但是在实际的情况下,一个表一般都有多个索引存在的,因此获取到的数据字典中,只要该字段在对应的索引中,则该字段就会标识为主键字段。
问题解决:
在以上的问题中,进行了脚本的修改,从而得到我想要的结果。修改的关键点就在于,查询索引的时候只关联主键所对应的索引名称
具体的详情可以看以下的运行结果
说明:
脚本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 行受影响)
*/