Я должен записать запрос на SQL-сервере для получения списка столбцов в конкретной таблице, ее связанные типы данных (с длиной) и если они не являются пустыми. И мне удалось сделать это очень.
Но теперь я также должен добраться, в той же таблице, против столбца - TRUE
если тот столбец является первичным ключом.
Как я делаю это?
Мой ожидаемый вывод:
Column name | Data type | Length | isnull | Pk
Чтобы избежать дублирования строк в некоторых столбцах, используйте user_type_id вместо system_type_id.
SELECT
c.name 'Column Name',
t.Name 'Data type',
c.max_length 'Max Length',
c.precision ,
c.scale ,
c.is_nullable,
ISNULL(i.is_primary_key, 0) 'Primary Key'
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 ic.object_id = i.object_id AND ic.index_id = i.index_id
WHERE
c.object_id = OBJECT_ID('YourTableName')
Просто замените YourTableName
своим фактическим именем таблицы - работает для SQL Server 2005 и новее.
Если вы используете схемы, замените YourTableName
на YourSchemaName.YourTableName
, где YourSchemaName
- фактическое имя схемы, а YourTableName] -
фактическое имя таблицы.
Вы можете использовать запрос:
select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH,
NUMERIC_PRECISION, DATETIME_PRECISION,
IS_NULLABLE
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='TableName'
, чтобы получить все требуемые метаданные, кроме информации Pk.
Расширяя ответ Алекса, вы можете сделать это, чтобы получить PK ограничение
Select C.COLUMN_NAME, C.DATA_TYPE, C.CHARACTER_MAXIMUM_LENGTH, C.NUMERIC_PRECISION, C.IS_NULLABLE, TC.CONSTRAINT_NAME
From INFORMATION_SCHEMA.COLUMNS As C
Left Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As TC
On TC.TABLE_SCHEMA = C.TABLE_SCHEMA
And TC.TABLE_NAME = C.TABLE_NAME
And TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
Where C.TABLE_NAME = 'Table'
Я, должно быть, пропустил, что вам нужен флаг, чтобы определить, является ли данный столбец частью PK, а не имя PK ограничения. Для этого вы можете использовать:
Select C.COLUMN_NAME, C.DATA_TYPE, C.CHARACTER_MAXIMUM_LENGTH
, C.NUMERIC_PRECISION, C.NUMERIC_SCALE
, C.IS_NULLABLE
, Case When Z.CONSTRAINT_NAME Is Null Then 0 Else 1 End As IsPartOfPrimaryKey
From INFORMATION_SCHEMA.COLUMNS As C
Outer Apply (
Select CCU.CONSTRAINT_NAME
From INFORMATION_SCHEMA.TABLE_CONSTRAINTS As TC
Join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE As CCU
On CCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
Where TC.TABLE_SCHEMA = C.TABLE_SCHEMA
And TC.TABLE_NAME = C.TABLE_NAME
And TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
And CCU.COLUMN_NAME = C.COLUMN_NAME
) As Z
Where C.TABLE_NAME = 'Table'
Хранимая процедура sp_columns возвращает подробную информацию о таблице.
exec sp_columns MyTable