Запрос SQL-сервера для получения списка столбцов в таблице вместе с типами данных, NOT NULL и ограничениями PRIMARY KEY - PullRequest
210 голосов
/ 10 марта 2010

Мне нужно написать запрос на SQL-сервере, чтобы получить список столбцов в конкретной таблице, связанные с ней типы данных (с длиной) и, если они не равны NULL. И мне удалось сделать это много.

Но теперь мне также нужно получить в той же таблице столбец - TRUE, если этот столбец является первичным ключом.

Как мне это сделать?

Мой ожидаемый результат:

Column name | Data type | Length | isnull | Pk

Ответы [ 17 ]

2 голосов
/ 14 мая 2018

Найти результат объединения для Datatype и Length и может иметь значение NULL и NULL. Используйте запрос ниже.

SELECT c.name AS 'Column Name',
       t.name + '(' + cast(c.max_length as varchar(50)) + ')' As 'DataType',
       case 
         WHEN  c.is_nullable = 0 then 'null' else 'not null'
         END AS 'Constraint'
  FROM sys.columns c
  JOIN sys.types t
    ON c.user_type_id = t.user_type_id
 WHERE c.object_id    = Object_id('TableName')

вы найдете результат, как показано ниже.

enter image description here

Спасибо.

2 голосов
/ 19 октября 2017
SELECT COLUMN_NAME, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM information_schema.columns WHERE table_name = '<name_of_table_or_view>'

Запустите SELECT * в приведенном выше выражении, чтобы увидеть, что возвращает information_schema.columns.

На этот вопрос ранее был дан ответ - https://stackoverflow.com/a/11268456/6169225

2 голосов
/ 14 января 2014
select
      c.name as [column name], 
      t.name as [type name],
      tbl.name as [table name]
from sys.columns c
         inner join sys.types t 
      on c.system_type_id = t.system_type_id 
         inner join sys.tables tbl
      on c.object_id = tbl.object_id
where
      c.object_id = OBJECT_ID('YourTableName1') 
          and 
      t.name like '%YourSearchDataType%'
union
(select
      c.name as [column name], 
      t.name as [type name],
      tbl.name as [table name]
from sys.columns c
         inner join sys.types t 
      on c.system_type_id = t.system_type_id 
         inner join sys.tables tbl
      on c.object_id = tbl.object_id
where
      c.object_id = OBJECT_ID('YourTableName2') 
          and 
      t.name like '%YourSearchDataType%')
union
(select
      c.name as [column name], 
      t.name as [type name],
      tbl.name as [table name]
from sys.columns c
         inner join sys.types t 
      on c.system_type_id = t.system_type_id 
         inner join sys.tables tbl
      on c.object_id = tbl.object_id
where
      c.object_id = OBJECT_ID('YourTableName3') 
          and 
      t.name like '%YourSearchDataType%')
order by tbl.name

Для поиска столбца или таблицы в зависимости от типа поиска для трех разных таблиц в одной базе данных. Этот запрос может быть расширен до n таблиц.

1 голос
/ 01 мая 2019

Я немного удивлен, что никто не упомянул

sp_help 'mytable'
0 голосов
/ 31 мая 2019

enter image description here

Запрос: EXEC SP_DESCRIBE_FIRST_RESULT_SET N'SELECT ANNUAL_INCOME FROM [BSLID2C]. [DBO]. [РАБОТНИК]

ПРИМЕЧАНИЕ. В НЕКОТОРОЙ ИДЕ ПЕРЕД ВЫБОРОМ N РАБОТАЕТ ИЛИ В НЕКОТОРЫХ ИДЕ БЕЗ РАБОТЫ N

0 голосов
/ 28 ноября 2018

Я только что сделал marc_s "презентация готова":

SELECT 
    c.name 'Column Name',
    t.name 'Data type',
    IIF(t.name = 'nvarchar', c.max_length / 2, c.max_length) 'Max Length',
    c.precision 'Precision',
    c.scale 'Scale',
    IIF(c.is_nullable = 0, 'No', 'Yes') 'Nullable',
    IIF(ISNULL(i.is_primary_key, 0) = 0, 'No', 'Yes') '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')
0 голосов
/ 28 апреля 2016
SELECT  
   T.NAME AS [TABLE NAME]
   ,C.NAME AS [COLUMN NAME]
   ,P.NAME AS [DATA TYPE]
   ,P.MAX_LENGTH AS [Max_SIZE]
   ,C.[max_length] AS [ActualSizeUsed]
   ,CAST(P.PRECISION AS VARCHAR) +'/'+ CAST(P.SCALE AS VARCHAR) AS [PRECISION/SCALE]
FROM SYS.OBJECTS AS T
JOIN SYS.COLUMNS AS C
    ON T.OBJECT_ID = C.OBJECT_ID
JOIN SYS.TYPES AS P
    ON C.SYSTEM_TYPE_ID = P.SYSTEM_TYPE_ID
    AND C.[user_type_id] = P.[user_type_id]
WHERE T.TYPE_DESC='USER_TABLE'
  AND T.name = 'InventoryStatus'
ORDER BY 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...