Вот подход, который в основном похож на @ 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
означает отсутствие дублирующихся значений и пустых значений (может быть либо PK, либо иметь уникальное ограничение / индекс);
UNIQUE WITH SINGLE NULL
- как можно догадаться, дубликатов нет, но есть один NULL (не может быть PK, но может иметь уникальное ограничение / индекс);
UNIQUE with NULLs
- без дубликатов, двух или более NULL (если вы используете SQL Server 2008, вы можете иметь условный уникальный индекс только для значений, отличных от NULL);
пустая строка - есть дубликаты, возможно, также NULL.