您的位置:首页 > 数据库

SQL查找数据库中所有没有主键的数据表脚本

2013-08-30 16:13 323 查看
--SQL查找数据库中所有没有主键的数据表脚本

--运行脚本后在消息中可能会显示下面现象中的一种:
--(1)数据库中所有数据表都有主键(则证明所有数据表都有主键)
--(2)当前数据表[数据表名]没有主键(则可方便找到没主键的数据表)

declare @TableName nvarchar(250)--游标中取出的数据表名
declare @AllTableHasPrimaryKey int--是否全部都有主键
set @AllTableHasPrimaryKey=1
--声明读取数据库所有数据表名和编号的游标
declare mycursor cursor for select name from dbo.SysObjects WHERE OBJECTPROPERTY(ID, 'IsUserTable') = 1 order by name
--打开游标
open mycursor
--从游标里取出数据赋值到我们刚才声明的数据表名变量中
fetch next from mycursor into @TableName
--如果游标执行成功
while (@@fetch_status=0)
begin

--判断当前数据表是否存在主键
IF NOT EXISTS (select * from information_schema.key_column_usage where TABLE_NAME=''+@TableName+'')
begin
set @AllTableHasPrimaryKey=0;
print '当前数据表['+@TableName+']没有主键'
end

--用游标去取下一条记录
fetch next from mycursor into @TableName
end

if(@AllTableHasPrimaryKey=1)
begin
print '数据库中所有数据表都有主键'
end

--关闭游标
close mycursor
--撤销游标
deallocate mycursor
--脚本代码结束

----查询表索引

SELECT

OBJECT_NAME(s.object_id) AS 表名,

COUNT(1) AS 唯一索引数量

FROM sys.indexes s

WHERE is_unique = 1

GROUP BY s.object_id

-----查询表table1的主键字段和索引

Declare @table_name varchar(100)
Set @table_name='table1'
--1、可以根据系统存储过程
Execute sp_pkeys @table_name

--2、根据系统表获得
Declare @objectid int
Set @objectid=object_id(@table_name)
Select
col_name(@objectid,colid) '主键字段'
From sysobjects as o
Inner Join sysindexes as i On i.name=o.name
Inner Join sysindexkeys as k On k.indid=i.indid
Where
o.xtype = 'PK' and parent_obj=@objectid and k.id=@objectid

--简易版查询所有主键为空的表

SELECT TableName = O.Name FROM sys.objects O WHERE o.name NOT IN ( SELECT o2.name FROM sysobjects o1 JOIN sysobjects o2 ON o1.parent_obj = o2.id AND o1.xtype = 'pk' ) AND O.type = 'U'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: