日期:2014-05-18  浏览次数:20591 次

两个问题:1:sql server是否给每条记录有行号? 2:怎么得到表的主键
如题:
1;在sql   server中是否给每条记录都有行号?如果有怎么得到?
2;怎么通过一个表名得到表的主键?
以上都要用sql语句来实现.在线等.谢谢


------解决方案--------------------
1.自己添加一个列来标识,一般为自增列,id int identity(1,1)
2.老大的代码:
SELECT
表名=case when a.colorder=1 then d.name else ' ' end,
字段序号=a.colorder,
字段名=a.name,
标识=case when COLUMNPROPERTY( a.id,a.name, 'IsIdentity ')=1 then '√ 'else ' ' 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,
类型=b.name,
占用字节数=a.length,
长度=COLUMNPROPERTY(a.id,a.name, 'PRECISION '),
小数位数=isnull(COLUMNPROPERTY(a.id,a.name, 'Scale '),0),
允许空=case when a.isnullable=1 then '√ 'else ' ' end,
默认值=isnull(e.text, ' '),
字段说明=isnull(g.[value], ' ')
FROM syscolumns a
left join systypes b on a.xtype=b.xusertype
inner join sysobjects d on a.id=d.id and d.xtype= 'U ' and d.name <> 'dtproperties '
left join syscomments e on a.cdefault=e.id
left join sysproperties g on a.id=g.id and a.colid=g.smallid
where d.name= ' ' --表名
order by a.id,a.colorder
------解决方案--------------------
select name from sysobjects where parent_obj=object_id( '表名 ') and xtype= 'pk '

------解决方案--------------------
看主键的话用楼上的代码看主键名称 用SP_HELP '表名 '看主键的字段
------解决方案--------------------
1.除了用自增列外,若在SQL2005中還可以用Rank() Over,要比自增列方便
例如:
/*
现在有个表A,包括学生姓名name,3门功课成绩b1,b2,b3,平均成绩c,学生类别type,现在需要一个查询语句查询出按类别和平均成绩的排序,并多出一列1,2,3。。。
比如有6条记录:
name b1 b2 b3 c type
张三 90 90 90 90 1
李四 99 99 99 99 1
王五 80 80 80 80 2
嘿嘿 70 70 70 70 1
哈哈 50 50 50 50 2
呵呵 60 60 60 60 2

查询后要得出:
name b1 b2 b3 c type 排名
李四 99 99 99 99 1 1
张三 90 90 90 90 1 2
嘿嘿 70 70 70 70 1 3
王五 80 80 80 80 2 1
呵呵 60 60 60 60 2 2
哈哈 50 50 50 50 2 3
*/

declare @tbl table([name] nvarchar(8), b1 int, b2 int, b3 int, c int, [type] int)
insert @tbl select N '张三 ', 90, 90, 90, 90, 1 union all select
N '李四 ', 99, 99 , 99, 99 , 1 union all select
N '王五 ', 80 , 80, 80, 80, 2 union all select
N '嘿嘿 ', 70 , 70 , 70 , 70 , 1 union all select
N '哈哈 ', 50, 50 , 50 , 50, 2 union all select
N '呵呵 ', 60, 60, 60, 60 , 2

--每條記錄加上行號
select RANK() OVER (order by [name]) as 行號,*
from @tbl
order by [name]

--每個類型中再進行排名
select *,RANK() OVER (PARTITION BY [type] order by c desc) as 排名
from @tbl
order by [type],c desc

--USE AdventureWorks;
--GO
--SELECT i.ProductID, p.Name, i.LocationID, i.Quantity, RANK() OVER (PARTITION BY i.LocationID order by i.Quantity) as RANK
--FROM Production.ProductInventory i JOIN Production.Product p
--ON i.ProductID = p.ProductID
--ORDER BY p.Name
--GO

/*
RANK ( ) OVER ( [ < partition_by_clause > ] < order_by_clause > )

< partition_by_clause >

将 FROM 子句生成的结果集划分为要应用 RANK 函数的分区。

< order_by_clause >

确定将 RANK 值应用于分区中的行时所基于的顺序

*/