SELECT CASE WHEN a.colorder = 1 THEN d.name ELSE '' END AS 表名,
CASE WHEN a.colorder = 1 THEN isnull(CONVERT(nvarchar, f.value), '')
ELSE '' END AS 表说明, a.colorder AS 字段序号, a.name AS 字段名,
CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity')
= 1 THEN '√' ELSE '' END AS 标识, 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 AS 主键, b.name AS 类型, a.length AS 占用字节数,
COLUMNPROPERTY(a.id, a.name, 'PRECISION') AS 长度,
ISNULL(COLUMNPROPERTY(a.id, a.name, 'Scale'), 0) AS 小数位数,
CASE WHEN a.isnullable = 1 THEN '√' ELSE '' END AS 允许空, ISNULL(e.text, '')
AS 默认值, ISNULL(CONVERT(nvarchar, g.[value]), '') AS 字段说明
FROM syscolumns a LEFT OUTER JOIN
systypes b ON a.xusertype = b.xusertype INNER JOIN
sysobjects d ON a.id = d.id AND d.xtype = 'U' AND
d.name <> 'dtproperties' LEFT OUTER JOIN
syscomments e ON a.cdefault = e.id LEFT OUTER JOIN
sysproperties g ON a.id = g.id AND a.colid = g.smallid LEFT OUTER JOIN
sysproperties f ON d.id = f.id AND f.smallid = 0
WHERE (d.name = 'MyTab') ORDER BY a.id, a.colorder
这是我在网上搜到的邹键老大写的一条查询表信息的查询语句
但这里面有一个地方查出来的数据是错误的:
SELECT name
FROM sysindexes
WHERE indid IN
(SELECT indid
FROM sysindexkeys
WHERE id = a.id AND colid = a.colid)))
也就是查主键的
我用这一条查询的时候比如我的表
ID int 标示 主键
TypeID int
Name nvarchar
---------------------------------
但查出来的时候ID和TypeID都变为主键了
我想是因为在别一个表中有
TypeID int 标示 主建
TypeName nvarchar
的原因
----------------------------------------
然后我查SQL的帮助的系统统表
中的 主键表 对像表 字段表 进行关联查询也没有办法正确查出一个表的主键请大家看看上面的语句要怎么来改才能正确的显示表信息中的主建
谢谢
CASE WHEN a.colorder = 1 THEN isnull(CONVERT(nvarchar, f.value), '')
ELSE '' END AS 表说明, a.colorder AS 字段序号, a.name AS 字段名,
CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity')
= 1 THEN '√' ELSE '' END AS 标识, 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 AS 主键, b.name AS 类型, a.length AS 占用字节数,
COLUMNPROPERTY(a.id, a.name, 'PRECISION') AS 长度,
ISNULL(COLUMNPROPERTY(a.id, a.name, 'Scale'), 0) AS 小数位数,
CASE WHEN a.isnullable = 1 THEN '√' ELSE '' END AS 允许空, ISNULL(e.text, '')
AS 默认值, ISNULL(CONVERT(nvarchar, g.[value]), '') AS 字段说明
FROM syscolumns a LEFT OUTER JOIN
systypes b ON a.xusertype = b.xusertype INNER JOIN
sysobjects d ON a.id = d.id AND d.xtype = 'U' AND
d.name <> 'dtproperties' LEFT OUTER JOIN
syscomments e ON a.cdefault = e.id LEFT OUTER JOIN
sysproperties g ON a.id = g.id AND a.colid = g.smallid LEFT OUTER JOIN
sysproperties f ON d.id = f.id AND f.smallid = 0
WHERE (d.name = 'MyTab') ORDER BY a.id, a.colorder
这是我在网上搜到的邹键老大写的一条查询表信息的查询语句
但这里面有一个地方查出来的数据是错误的:
SELECT name
FROM sysindexes
WHERE indid IN
(SELECT indid
FROM sysindexkeys
WHERE id = a.id AND colid = a.colid)))
也就是查主键的
我用这一条查询的时候比如我的表
ID int 标示 主键
TypeID int
Name nvarchar
---------------------------------
但查出来的时候ID和TypeID都变为主键了
我想是因为在别一个表中有
TypeID int 标示 主建
TypeName nvarchar
的原因
----------------------------------------
然后我查SQL的帮助的系统统表
中的 主键表 对像表 字段表 进行关联查询也没有办法正确查出一个表的主键请大家看看上面的语句要怎么来改才能正确的显示表信息中的主建
谢谢
(ID int Primary Key,
TypeID int,
Name nvarchar(20))
Create Table TEST
(TypeID int Primary Key,
TypeName nvarchar(20))
GO
SELECT CASE WHEN a.colorder = 1 THEN d.name ELSE '' END AS 表名,
CASE WHEN a.colorder = 1 THEN isnull(CONVERT(nvarchar, f.value), '')
ELSE '' END AS 表说明, a.colorder AS 字段序号, a.name AS 字段名,
CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity')
= 1 THEN '√' ELSE '' END AS 标识, 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 AS 主键, b.name AS 类型, a.length AS 占用字节数,
COLUMNPROPERTY(a.id, a.name, 'PRECISION') AS 长度,
ISNULL(COLUMNPROPERTY(a.id, a.name, 'Scale'), 0) AS 小数位数,
CASE WHEN a.isnullable = 1 THEN '√' ELSE '' END AS 允许空, ISNULL(e.text, '')
AS 默认值, ISNULL(CONVERT(nvarchar, g.[value]), '') AS 字段说明
FROM syscolumns a LEFT OUTER JOIN
systypes b ON a.xusertype = b.xusertype INNER JOIN
sysobjects d ON a.id = d.id AND d.xtype = 'U' AND
d.name <> 'dtproperties' LEFT OUTER JOIN
syscomments e ON a.cdefault = e.id LEFT OUTER JOIN
sysproperties g ON a.id = g.id AND a.colid = g.smallid LEFT OUTER JOIN
sysproperties f ON d.id = f.id AND f.smallid = 0
WHERE (d.name = 'MyTab') ORDER BY a.id, a.colorder
GO
Drop Table MyTab, TEST
/*
表名 表说明 字段序号 字段名 标识 主键 类型 占用字节数 长度 小数位数 允许空 默认值 字段说明
MyTab 1 ID √ int 4 10 0
2 TypeID int 4 10 0 √
3 Name nvarchar 40 20 0 √
*/
a.colorder AS 字段序号, a.name AS 字段名,
CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity')
= 1 THEN '√' ELSE '' END AS 标识, 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 AS 主键, b.name AS 类型
FROM syscolumns a LEFT OUTER JOIN
systypes b ON a.xusertype = b.xusertype INNER JOIN
sysobjects d ON a.id = d.id AND d.xtype = 'U' AND
d.name <> 'dtproperties'
WHERE (d.name = 'MyTab') ORDER BY a.id, a.colorder
--Result
/*
表名 字段序号 字段名 标识 主键 类型
MyTab 1 ID √ int
2 TypeID int
3 Name nvarchar
*/
但是我的Agent表里面只有主键AgentID 但他里面的 SponsorID 查出来也是主键
但我表里面是没有主键的
FROM syscolumns
WHERE (id = OBJECT_ID(N'Agent')) AND (COLUMNPROPERTY(id, name, 'IsIdentity')
= 1)
我用这一条单主键的可以正确查出来
但是表有多个字段这个查询语句就查不出来了
(ID int Primary Key,
TypeID int,
Name nvarchar(20))
Create Table TEST
(TypeID int Primary Key,
TypeName nvarchar(20))
GO
SELECT CASE WHEN a.colorder = 1 THEN d.name ELSE '' END AS 表名,
a.colorder AS 字段序号, a.name AS 字段名,
CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity')
= 1 THEN '√' ELSE '' END AS 标识, 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 AS 主键, b.name AS 类型
FROM syscolumns a LEFT OUTER JOIN
systypes b ON a.xusertype = b.xusertype INNER JOIN
sysobjects d ON a.id = d.id AND d.xtype = 'U' AND
d.name <> 'dtproperties'
WHERE (d.name = 'MyTab') ORDER BY a.id, a.colorder
GO
Drop Table MyTab, TEST
--Result
/*
表名 字段序号 字段名 标识 主键 类型
MyTab 1 ID √ int
2 TypeID int
3 Name nvarchar
*/
sp_pkeys 'Tablename'
用鱼兄别的地方写的这一条就可以查出来
但怎么和上面的进行合并呢
SELECT CASE WHEN a.colorder = 1 THEN d.name ELSE '' END AS 表名,
CASE WHEN a.colorder = 1 THEN isnull(CONVERT(nvarchar, f.value), '')
ELSE '' END AS 表说明, a.colorder AS 字段序号, a.name AS 字段名,
CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity')
= 1 THEN '√' ELSE '' END AS 标识, CASE WHEN EXISTS
(SELECT 1
FROM sysobjects
WHERE parent_obj = object_id('MyTab') and /*!!!只增加此行!!!*/
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 AS 主键, b.name AS 类型, a.length AS 占用字节数,
......
hellowork(一两清风)什麼情況有問題,怎麼我測試的沒有出錯?
就出现了这个问题
hellowork(一两清风)的代码我先试一下
但这样的话你的
WHERE parent_obj = object_id('MyTab') and /*!!!只增加此行!!!*/
这里指字了表但我如果是要查出表中所有的信息就不能object_id('MyTab') 要怎么改
下面这个判断的确不太严谨,表多的时候表露的几率就会大些:
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)))
CASE WHEN a.colorder = 1 THEN isnull(CONVERT(nvarchar, f.value), '')
ELSE '' END AS 表说明, a.colorder AS 字段序号, a.name AS 字段名,
CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity')
= 1 THEN '√' ELSE '' END AS 标识, CASE WHEN EXISTS
(SELECT 1
FROM sysobjects
WHERE parent_obj = object_id(d .name) AND 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 AS 主键, b.name AS 类型, a.length AS 占用字节数,
COLUMNPROPERTY(a.id, a.name, 'PRECISION') AS 长度,
ISNULL(COLUMNPROPERTY(a.id, a.name, 'Scale'), 0) AS 小数位数,
CASE WHEN a.isnullable = 1 THEN '√' ELSE '' END AS 允许空, ISNULL(e.text, '')
AS 默认值, ISNULL(CONVERT(nvarchar, g.[value]), '') AS 字段说明
FROM syscolumns a LEFT OUTER JOIN
systypes b ON a.xusertype = b.xusertype INNER JOIN
sysobjects d ON a.id = d .id AND d .xtype = 'U' AND
d .name <> 'dtproperties' LEFT OUTER JOIN
syscomments e ON a.cdefault = e.id LEFT OUTER JOIN
sysproperties g ON a.id = g.id AND a.colid = g.smallid LEFT OUTER JOIN
sysproperties f ON d .id = f.id AND f.smallid = 0
ORDER BY d .name, a.colorder好了这才是真正正确的
得谢谢hellowork(一两清风)。