这是一种与@JNK 基本相似的方法,但它不是打印计数,而是为每一列返回一个现成的答案,告诉您一列是否仅包含唯一值:
DECLARE @table varchar(100), @sql varchar(max);
SET @table = 'some table name';
SELECT
@sql = COALESCE(@sql + ', ', '') + ColumnExpression
FROM (
SELECT
ColumnExpression =
'CASE COUNT(DISTINCT ' + COLUMN_NAME + ') ' +
'WHEN COUNT(*) THEN ''UNIQUE'' ' +
'ELSE '''' ' +
'END AS ' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table
) s
SET @sql = 'SELECT ' + @sql + ' FROM ' + @table;
PRINT @sql; /* in case you want to have a look at the resulting query */
EXEC(@sql);
它只是将每一列的COUNT(DISTINCT column) 与COUNT(*) 进行比较。结果将是一个包含单行的表,其中每一列将包含值 UNIQUE 用于那些没有重复的列,如果存在重复则为空字符串。
但上述解决方案仅适用于那些没有 NULL 的列。应该注意的是,当您要在列上创建唯一约束/索引时,SQL Server 不会忽略 NULL。如果一列只包含一个 NULL 并且所有其他值都是唯一的,您仍然可以在该列上创建唯一约束(但是,您不能将其设为主键,这需要值的唯一性和不存在 NULL)。
因此,您可能需要对内容进行更彻底的分析,您可以使用以下脚本获得:
DECLARE @table varchar(100), @sql varchar(max);
SET @table = 'some table name';
SELECT
@sql = COALESCE(@sql + ', ', '') + ColumnExpression
FROM (
SELECT
ColumnExpression =
'CASE COUNT(DISTINCT ' + COLUMN_NAME + ') ' +
'WHEN COUNT(*) THEN ''UNIQUE'' ' +
'WHEN COUNT(*) - 1 THEN ' +
'CASE COUNT(DISTINCT ' + COLUMN_NAME + ') ' +
'WHEN COUNT(' + COLUMN_NAME + ') THEN ''UNIQUE WITH SINGLE NULL'' ' +
'ELSE '''' ' +
'END ' +
'WHEN COUNT(' + COLUMN_NAME + ') THEN ''UNIQUE with NULLs'' ' +
'ELSE '''' ' +
'END AS ' + COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table
) s
SET @sql = 'SELECT ' + @sql + ' FROM ' + @table;
PRINT @sql; /* in case you still want to have a look at the resulting query */
EXEC(@sql);
此解决方案通过检查三个值来考虑 NULL:COUNT(DISTINCT column)、COUNT(column) 和 COUNT(*)。它显示的结果与前一个解决方案类似,但列的可能诊断更加多样化:
UNIQUE 表示没有重复值和 NULL(可以是 PK 或具有唯一约束/索引);
UNIQUE WITH SINGLE NULL – 可以猜到,没有重复,但是有一个 NULL(不能是 PK,但可以有唯一的约束/索引);
UNIQUE with NULLs – 没有重复,两个或多个 NULL(如果您使用的是 SQL Server 2008,则可能只有非 NULL 值的条件唯一索引);
空字符串 - 有重复,也可能是 NULL。