Получение деталей столбцов SQL Server: типы данных, PK
Быстрый ответ
Для получения данных о столбцах применяем следующий SQL-запрос:
SELECT
col.COLUMN_NAME, -- наименование столбца
col.DATA_TYPE, -- тип данных столбца
CASE
WHEN col.IS_NULLABLE = 'NO' THEN 'NOT NULL' -- условие NOT NULL
END as IS_NULLABLE,
CASE
WHEN pk.COLUMN_NAME IS NOT NULL THEN 'PRIMARY KEY' -- обозначение PRIMARY KEY
END as COLUMN_KEY
FROM
INFORMATION_SCHEMA.COLUMNS col
LEFT JOIN
INFORMATION_SCHEMA.KEY_COLUMN_USAGE pk ON
col.TABLE_SCHEMA = pk.TABLE_SCHEMA AND
col.TABLE_NAME = pk.TABLE_NAME AND
col.COLUMN_NAME = pk.COLUMN_NAME AND
pk.CONSTRAINT_NAME = (
SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE
(TABLE_SCHEMA = col.TABLE_SCHEMA OR TABLE_SCHEMA IS NULL) AND
TABLE_NAME = col.TABLE_NAME AND
CONSTRAINT_TYPE = 'PRIMARY KEY'
)
WHERE
col.TABLE_NAME = 'YourTableName' AND
(col.TABLE_SCHEMA = 'YourSchemaName' OR col.TABLE_SCHEMA IS NULL)
ORDER BY
col.ORDINAL_POSITION;
Необходимо заменить 'YourTableName'
и 'YourSchemaName'
на имена нужной вам таблицы и схемы. Запрос выдаст точные наименования столбцов, типы данных, информацию о NOT NULL и PRIMARY KEY.
Обращение к системным каталогам
Если вам нужна подробная информация о структуре таблицы, обратитесь к системным представлениям каталога SQL Server:
SELECT
c.name AS 'Название столбца',
t.name AS 'Тип данных',
c.max_length AS 'Максимальная длина',
c.precision AS 'Точность',
c.scale AS 'Масштаб',
c.is_nullable AS 'NULL допустим',
CASE WHEN ic.is_primary_key = 1 THEN 'Да' ELSE 'Нет' END AS 'Является ли первичным ключом'
FROM
sys.columns c
INNER JOIN
sys.types t ON c.user_type_id = t.user_type_id
LEFT OUTER JOIN
sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN
sys.indexes i ON i.object_id = ic.object_id AND i.index_id = ic.index_id AND i.is_primary_key = 1
WHERE
c.object_id = OBJECT_ID('YourSchemaName.YourTableName')
ORDER BY
c.column_id;
Данный запрос предоставит детализированную информацию по каждому столбцу, включая типы данных и ключевые ограничения. Он предназначен для использования в SQL Server 2005 и более новых версиях.
Использование sp_columns
и sp_describe_first_result_set
В отдельных случаях можно использовать хранимые процедуры:
sp_columns
: Этот метод возвращает информацию о типах данных и допустимости NULL, но не информацию о первичных ключах. Для быстрого просмотра столбцов используйтеEXEC sp_columns 'YourTableName';
.sp_describe_first_result_set
(Доступно с SQL Server 2012): Предоставляет метаданные первого результата SQL-запроса. КомандаEXEC sp_describe_first_result_set N'SELECT * FROM YourSchemaName.YourTableName';
позволяет узнать структуру результатов вашего запроса.
Однако, эти методы могут не дать полного представления обо всех ограничениях.
Визуализация
Представьте себе структуру таблицы как игровое поле:
🧱 = Столбец
🏷️ = Тип данных
🔒 = NOT NULL
🔑 = PRIMARY KEY
Игровое поле (Таблица):
--------------------------------------
| 🧱 | 🏷️ | 🔒 | 🔑 |
|----|----|----|----|
| 1 | A | 🔒 | | <- Столбец NOT NULL без PRIMARY KEY
| 2 | B | | 🔑 | <- Столбец с PRIMARY KEY
| 3 | C | | | <- Столбец, допускающий NULL
| 4 | D | 🔒 | 🔑 | <- Столбец NOT NULL и PRIMARY KEY
--------------------------------------
Каждый элемент этой диаграммы отражает свойства соответствующего столбца в таблице.
Поглубже в детали метаданных
В SQL Server есть и другие свойства столбцов:
- Идентификационные столбцы: Это можно установить с помощью функции
COLUMNPROPERTY
. - Ограничения по умолчанию: Они могут быть исследованы через
sys.default_constraints
. - Вычисляемые столбцы: Определяются через атрибут
is_computed
вsys.columns
.
Учитывая эти аспекты, можно получить более полное представление о структуре таблицы.
Полезные материалы
- Системные представления схемы информации (Transact-SQL) – SQL Server | Обучение Microsoft
- sys.objects (Transact-SQL) – SQL Server | Обучение Microsoft
- Первичные и внешние ключи – SQL Server | Обучение Microsoft
- Типы данных (Transact-SQL) – SQL Server | Обучение Microsoft
- Как получить список всех таблиц в базе данных с помощью T-SQL?