Sql 用于测试主键是否存在的脚本

Sql 用于测试主键是否存在的脚本,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,试图找出一个SQL脚本来测试表中是否存在主键。如果表没有主键,那么脚本应该输出表名 Tables to test: TableA TableB TableC 运行脚本后(假设TableA和TableC有PKs,但没有TableB),输出如下: NoKeys TableB 我没有准确/完整的代码供您使用,但我的想法是: 您需要循环浏览数据库中的表列表: SELECT * FROM information_schema.tables 检查表是否存在主键的代码如下: SELECT * F

试图找出一个SQL脚本来测试表中是否存在主键。如果表没有主键,那么脚本应该输出表名

Tables to test:
TableA
TableB
TableC
运行脚本后(假设TableA和TableC有PKs,但没有TableB),输出如下:

NoKeys
TableB

我没有准确/完整的代码供您使用,但我的想法是:

您需要循环浏览数据库中的表列表:

SELECT *  
FROM information_schema.tables
检查表是否存在主键的代码如下:

SELECT *  
FROM information_schema.table_constraints  
WHERE constraint_type = 'PRIMARY KEY'   
AND table_name = @Your_Table_Name
怎么样

USE information_schema;
SELECT 'TABLE_NAME' FROM 'TABLES' LEFT JOIN 'TABLE_CONSTRAINTS' USING('TABLE_SCHEMA', 'TABLE_NAME') WHERE 'TABLE_SCHEMA' = '__PUT_YOUR_DB_NAME_HERE__' AND 'CONSTRAINT_NAME' LIKE '%PRIMARY%' AND ISNULL('CONSTRAINT_CATALOG')

我喜欢肖恩的回答,这对我很有用。你可以添加这个子句

其中t.TABLE\u TYPE='BASE TABLE'

如果您不想同时获取视图,则在
EXCEPT
语句之前

;WITH tables_with_pk AS (
  SELECT t.table_schema, t.table_name
  FROM INFORMATION_SCHEMA.TABLES t 
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
      ON t.TABLE_NAME = tc.TABLE_NAME AND t.table_schema = tc.table_schema
  WHERE tc.constraint_type = 'PRIMARY KEY' 
)
SELECT t.table_schema, t.table_name
FROM INFORMATION_SCHEMA.TABLES t 
WHERE t.TABLE_TYPE = 'BASE TABLE'
EXCEPT
SELECT table_schema, table_name
FROM tables_with_pk

如果没有主键,则返回0, 如果存在主键,则返回1

SELECT OBJECTPROPERTY(OBJECT_ID(N'MyTable'),'TableHasPrimaryKey')
我的版本:

选择1
从SYS.KEY\u约束
其中[TYPE]=“PK”和[PARENT_OBJECT_ID]=OBJECT_ID('USER.USER');

作为参考,请检查Microsoft文档。

So
从信息模式中选择表模式、表名称。表名称位于('TableA'、'TableB'、'TableC')中的表,选择表模式除外,TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='PRIMARY KEY'
?如何更改它以只搜索整个数据库?nm只需删除带有in子句的WHERE这应该是选中的答案。这非常好,比从INFORMATION_SCHEMA中选择的典型方法紧凑得多。
SELECT OBJECTPROPERTY(OBJECT_ID(N'MyTable'),'TableHasPrimaryKey')