Ответ 1
Здесь подход, который в основном похож на @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, а все остальные значения уникальны, вы все равно можете создать уникальное ограничение для столбца (вы не можете сделать его первичным ключом, хотя это требует как uniquness значений, так и отсутствия NULL).
Поэтому вам может потребоваться более тщательный анализ содержимого, которое вы можете получить со следующим script:
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 тоже.