Co jest odpowiednikiem „opisu tabeli” w SQL Server?

321

Mam bazę danych SQL Server i chcę wiedzieć, jakie kolumny i typy ma. Wolę to zrobić za pomocą zapytania niż za pomocą GUI takiego jak Enterprise Manager. Czy jest na to sposób?

marc_s
źródło
1
Kolejny stackoverflow [pytanie] [1] odpowiedział na to [1]: stackoverflow.com/questions/11078106/…
Shiva
Nie rozumiem, dlaczego Microsoft nie umieścił wcześniej tej opcji. To musi mieć funkcjonalność.
Sukumaar

Odpowiedzi:

342

Możesz użyć procedury przechowywanej sp_columns :

exec sp_columns MyTable
Vincent Ramdhanie
źródło
1
Dzięki - miałem właśnie zamieścić to samo pytanie z T-SQL zamiast MSSQL.
Jedidja
11
Krótka uwaga: nie umieszczaj nazwy tabeli w cudzysłowach i nie używaj składni TableOwner.TableName.
Gezim,
1
Zobacz tutaj, jeśli nie otrzymujesz żadnych wyników po uruchomieniu tego zapytania.
mlissner,
12
użyj Wybierz * z INFORMACJI_SCHEMA.KOLUMNÓW Gdzie TABLE_NAME = „TABLENAME”, jeśli nie chcesz korzystać z procedury składowanej
Matias Elorriaga
1
Dane wyjściowe z sp_columns są absurdalnie nieczytelne w sqlcmd, nawet przy użyciu ogromnych szerokości terminali. Zastosowane selectponiżej rozwiązania są znacznie bardziej odpowiednie dla użytkowników sqlcmd.
ctpenrose
123

Istnieje kilka metod uzyskiwania metadanych dotyczących tabeli:

EXEC sp_help tablename

Zwróci kilka zestawów wyników, opisujących tabelę, jej kolumny i ograniczenia.

Te INFORMATION_SCHEMApoglądy daje informacje, które chcesz, choć niestety trzeba kwerendy poglądy i połączyć je ręcznie.

Brannon
źródło
7
Dla mnie to zadziałało bez znaku „@” EXEC sp_help 'table_name'
Ali
jest to bardziej poprawna wersja odpowiedzi Viranji. Jednak @jest to niepoprawna składnia.
pcnate
Wygląda jak @tablenamezmienna w tym przykładzie. SP działa w obie strony, z ciągiem znaków lub zwykłą tablename ( exec sp_help Employeeslub exec sp_help 'Employees')
KekuSemau
FYI: Schemat (a nawet baza danych) może przebiegać w obrębie execute sp_help 'db.sch.your_table
tyknięć
53

Na wypadek, gdybyś nie chciał używać zapisanego proc, oto prosta wersja zapytania

select * 
  from information_schema.columns 
 where table_name = 'aspnet_Membership'
 order by ordinal_position
Salamander2007
źródło
1
W moim przypadku ma to również zastosowanie, jeśli z jakiegoś powodu te przechowywane procesy nie są dostępne.
James Mills,
Przechowywany proc jest nieelastyczny i naprawdę wrogi dla naiwnych użytkowników sqlcmd takich jak ja
ctpenrose
uwielbiam ten, jak nakazuje po imieniu: D
Marin
33

Możesz użyć następujących

sp_help tablename

Przykład: sp_help Customer

LUB Użyj skrótu

  • wybierz tabelę naciśnij Alt + F1

Przykład: Klient Naciśnij klawisze Alt + F1

Viranja kaushalya
źródło
Zauważ, że jeśli masz tabelę w schemacie zdefiniowanym przez użytkownika, powinieneś wykluczyć ją z zapytania. Wszystkie schematy zawierające tabelę o tej nazwie pojawią się w kolumnie o nazwie „TABLE_OWNER” w zestawie wyników.
Buggieboy
Pamiętaj, że aby skrót działał, tabela / widok / procedura musi być całkowicie wybrana. SSMS nie rozszerza automatycznie wyboru (oczekiwałbym tego). Ctrl+Wmożna użyć do rozszerzenia wyboru i wybrania całej nazwy.
bugybunny
29

Użyj tego zapytania

Select * From INFORMATION_SCHEMA.COLUMNS Where TABLE_NAME = 'TABLENAME'
sukhi
źródło
1
Działa dla mnie, jeśli najpierw powiesz „użyj MyDatabase”.
Jason D
Podoba mi się to, ponieważ działa również na MySQL, więc nie muszę zmieniać kodu SQL w kodzie
Abdul
1
Ta odpowiedź nie różni się niczym od stackoverflow.com/a/319424/695671, który pojawił się 5 lat wcześniej. Nie uznaję powtarzających się odpowiedzi za przydatne.
Jason S
15

Oprócz sposobów pokazanych w innych odpowiedziach możesz użyć

SELECT TOP 0 * FROM table_name

To da ci nazwę każdej kolumny, bez żadnych wyników, i kończy się niemal natychmiast przy minimalnym obciążeniu.

kingfrito_5005
źródło
TOP 1 dałby również przykładowe dane, które mogą być bardziej ilustracyjne.
Spurgeon
14

Proszę użyć następującego zapytania SQL; to zadziałało w mojej sprawie.

select * FROM   INFORMATION_SCHEMA.Columns where table_name = 'tablename';
Abhijeet
źródło
2
Ta sama odpowiedź została udzielona w 2008 i 2014 roku. Nie uważam, aby powtarzane odpowiedzi były przydatne.
Jason S
14

Po prostu wybierz tabelę i naciśnij Alt+ F1,

pokaże wszystkie informacje o tabeli, takie jak nazwa kolumny, typ danych, klucze itp.

Shwetank Suthar
źródło
7
OP poprosił o metodę bez GUI
Spikolynn
7

Napisałem sql * plus DESC (RIBE) jak select (wyświetla również komentarze do kolumn) w t-sql:

USE YourDB
GO

DECLARE @objectName NVARCHAR(128) = 'YourTable';

SELECT
  a.[NAME]
 ,a.[TYPE]
 ,a.[CHARSET]
 ,a.[COLLATION]
 ,a.[NULLABLE]
 ,a.[DEFAULT]
 ,b.[COMMENTS]
-- ,a.[ORDINAL_POSITION]
FROM
  (
    SELECT
      COLUMN_NAME                                     AS [NAME]
     ,CASE DATA_TYPE
        WHEN 'char'       THEN DATA_TYPE  + '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
        WHEN 'numeric'    THEN DATA_TYPE  + '(' + CAST(NUMERIC_PRECISION AS VARCHAR) + ', ' + CAST(NUMERIC_SCALE AS VARCHAR) + ')'
        WHEN 'nvarchar'   THEN DATA_TYPE  + '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
        WHEN 'varbinary'  THEN DATA_TYPE + '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
        WHEN 'varchar'    THEN DATA_TYPE   + '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
        ELSE DATA_TYPE
      END                                             AS [TYPE]
     ,CHARACTER_SET_NAME                              AS [CHARSET]
     ,COLLATION_NAME                                  AS [COLLATION]
     ,IS_NULLABLE                                     AS [NULLABLE]
     ,COLUMN_DEFAULT                                  AS [DEFAULT]
     ,ORDINAL_POSITION
    FROM   
      INFORMATION_SCHEMA.COLUMNS
    WHERE
      TABLE_NAME = @objectName
  ) a
  FULL JOIN
  (
   SELECT
     CAST(value AS NVARCHAR)                        AS [COMMENTS]
    ,CAST(objname AS NVARCHAR)                      AS [NAME]
   FROM
     ::fn_listextendedproperty ('MS_Description', 'user', 'dbo', 'table', @objectName, 'column', default)
  ) b
  ON a.NAME COLLATE YourCollation = b.NAME COLLATE YourCollation
ORDER BY
  a.[ORDINAL_POSITION];

Wyżej wymieniony wybór może być używany w procedurze przechowywanej oznaczonej przez system i można go wywołać z dowolnej bazy danych instancji w prosty sposób:

USE master;
GO

IF OBJECT_ID('sp_desc', 'P') IS NOT NULL
  DROP PROCEDURE sp_desc
GO

CREATE PROCEDURE sp_desc (
  @tableName  nvarchar(128)
) AS
BEGIN
  DECLARE @dbName       sysname;
  DECLARE @schemaName   sysname;
  DECLARE @objectName   sysname;
  DECLARE @objectID     int;
  DECLARE @tmpTableName varchar(100);
  DECLARE @sqlCmd       nvarchar(4000);

  SELECT @dbName = PARSENAME(@tableName, 3);
  IF @dbName IS NULL SELECT @dbName = DB_NAME();

  SELECT @schemaName = PARSENAME(@tableName, 2);
  IF @schemaName IS NULL SELECT @schemaName = SCHEMA_NAME();

  SELECT @objectName = PARSENAME(@tableName, 1);
  IF @objectName IS NULL
    BEGIN
      PRINT 'Object is missing from your function call!';
      RETURN;
    END;

  SELECT @objectID = OBJECT_ID(@dbName + '.' + @schemaName + '.' + @objectName);
  IF @objectID IS NULL
    BEGIN
      PRINT 'Object [' + @dbName + '].[' + @schemaName + '].[' + @objectName + '] does not exist!';
      RETURN;
    END;

  SELECT @tmpTableName = '#tmp_DESC_' + CAST(@@SPID AS VARCHAR) + REPLACE(REPLACE(REPLACE(REPLACE(CAST(CONVERT(CHAR, GETDATE(), 121) AS VARCHAR), '-', ''), ' ', ''), ':', ''), '.', '');
  --PRINT @tmpTableName;
  SET @sqlCmd = '
    USE ' + @dbName + '
    CREATE TABLE ' + @tmpTableName + ' (
      [NAME]              nvarchar(128) NOT NULL
     ,[TYPE]              varchar(50)
     ,[CHARSET]           varchar(50)
     ,[COLLATION]         varchar(50)
     ,[NULLABLE]          varchar(3)
     ,[DEFAULT]           nvarchar(4000)
     ,[COMMENTS]          nvarchar(3750));

    INSERT INTO ' + @tmpTableName + '
    SELECT
      a.[NAME]
     ,a.[TYPE]
     ,a.[CHARSET]
     ,a.[COLLATION]
     ,a.[NULLABLE]
     ,a.[DEFAULT]
     ,b.[COMMENTS]
    FROM
      (
        SELECT
          COLUMN_NAME                                     AS [NAME]
         ,CASE DATA_TYPE
            WHEN ''char''      THEN DATA_TYPE + ''('' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + '')''
            WHEN ''numeric''   THEN DATA_TYPE + ''('' + CAST(NUMERIC_PRECISION AS VARCHAR) + '', '' + CAST(NUMERIC_SCALE AS VARCHAR) + '')''
            WHEN ''nvarchar''  THEN DATA_TYPE + ''('' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + '')''
            WHEN ''varbinary'' THEN DATA_TYPE + ''('' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + '')''
            WHEN ''varchar''   THEN DATA_TYPE + ''('' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + '')''
            ELSE DATA_TYPE
          END                                             AS [TYPE]
         ,CHARACTER_SET_NAME                              AS [CHARSET]
         ,COLLATION_NAME                                  AS [COLLATION]
         ,IS_NULLABLE                                     AS [NULLABLE]
         ,COLUMN_DEFAULT                                  AS [DEFAULT]
         ,ORDINAL_POSITION
        FROM   
          INFORMATION_SCHEMA.COLUMNS
        WHERE   
          TABLE_NAME = ''' + @objectName + '''
      ) a
      FULL JOIN
      (
         SELECT
           CAST(value AS NVARCHAR)                        AS [COMMENTS]
          ,CAST(objname AS NVARCHAR)                      AS [NAME]
         FROM
           ::fn_listextendedproperty (''MS_Description'', ''user'', ''' + @schemaName + ''', ''table'', ''' + @objectName + ''', ''column'', default)
      ) b
      ON a.NAME COLLATE Hungarian_CI_AS = b.NAME COLLATE Hungarian_CI_AS
    ORDER BY
      a.[ORDINAL_POSITION];

    SELECT * FROM ' + @tmpTableName + ';'

    --PRINT @sqlCmd;

    EXEC sp_executesql @sqlCmd;
    RETURN;
END;
GO

EXEC sys.sp_MS_marksystemobject sp_desc
GO

Aby wykonać procedurę:

EXEC sp_desc 'YourDB.YourSchema.YourTable';

Jeśli chcesz uzyskać opis obiektu bieżącej bazy danych (i schematu), wpisz prosty typ:

EXEC sp_desc 'YourTable';

Ponieważ sp_desc jest procedurą oznaczoną przez system, możesz nawet pozostawić polecenie exec (i tak nie jest zalecane):

sp_desc 'YourTable';
Zsolt Hidasi
źródło
6

SQL Server równoważny poleceniu Oracle describeto przechowywany procsp_help

describeKomenda daje informacje na temat nazwy kolumn, typy, długości, itp

W SQL Server, powiedzmy, że chcesz opisać tabelę „mytable” w schemacie „myschema” w bazie danych „mydb”, możesz wykonać następujące czynności:

USE mydb;
exec sp_help 'myschema.mytable';
VHS
źródło
5

Możesz użyć sp_help „TableName”

użytkownik3819354
źródło
2

Problem z tymi odpowiedziami polega na tym, że brakuje kluczowych informacji. Chociaż jest to nieco niechlujne, jest to szybka wersja, którą wymyśliłem, aby upewnić się, że zawiera te same informacje, które wyświetla MySQL Describe.

Select SC.name AS 'Field', ISC.DATA_TYPE AS 'Type', ISC.CHARACTER_MAXIMUM_LENGTH AS 'Length', SC.IS_NULLABLE AS 'Null', I.is_primary_key AS 'Key', SC.is_identity AS 'Identity'
From sys.columns AS SC 
LEFT JOIN sys.index_columns AS IC
ON IC.object_id = OBJECT_ID('dbo.Expenses') AND 
IC.column_id = SC.column_id
LEFT JOIN sys.indexes AS I 
ON I.object_id = OBJECT_ID('dbo.Expenses') AND 
IC.index_id = I.index_id
LEFT JOIN information_schema.columns ISC
ON ISC.TABLE_NAME = 'Expenses'
AND ISC.COLUMN_NAME = SC.name
WHERE SC.object_id = OBJECT_ID('dbo.Expenses')

źródło
czy jest jakiś powód, dla którego is_primary_key nigdy nie miałby wartości?
Michael,
2

To jest kod, którego używam w EntityFramework Reverse POCO Generator(dostępny tutaj )

Tabela SQL:

SELECT  c.TABLE_SCHEMA AS SchemaName,
        c.TABLE_NAME AS TableName,
        t.TABLE_TYPE AS TableType,
        c.ORDINAL_POSITION AS Ordinal,
        c.COLUMN_NAME AS ColumnName,
        CAST(CASE WHEN IS_NULLABLE = 'YES' THEN 1
                  ELSE 0
             END AS BIT) AS IsNullable,
        DATA_TYPE AS TypeName,
        ISNULL(CHARACTER_MAXIMUM_LENGTH, 0) AS [MaxLength],
        CAST(ISNULL(NUMERIC_PRECISION, 0) AS INT) AS [Precision],
        ISNULL(COLUMN_DEFAULT, '') AS [Default],
        CAST(ISNULL(DATETIME_PRECISION, 0) AS INT) AS DateTimePrecision,
        ISNULL(NUMERIC_SCALE, 0) AS Scale,
        CAST(COLUMNPROPERTY(OBJECT_ID(QUOTENAME(c.TABLE_SCHEMA) + '.' + QUOTENAME(c.TABLE_NAME)), c.COLUMN_NAME, 'IsIdentity') AS BIT) AS IsIdentity,
        CAST(CASE WHEN COLUMNPROPERTY(OBJECT_ID(QUOTENAME(c.TABLE_SCHEMA) + '.' + QUOTENAME(c.TABLE_NAME)), c.COLUMN_NAME, 'IsIdentity') = 1 THEN 1
                  WHEN COLUMNPROPERTY(OBJECT_ID(QUOTENAME(c.TABLE_SCHEMA) + '.' + QUOTENAME(c.TABLE_NAME)), c.COLUMN_NAME, 'IsComputed') = 1 THEN 1
                  WHEN DATA_TYPE = 'TIMESTAMP' THEN 1
                  ELSE 0
             END AS BIT) AS IsStoreGenerated,
        CAST(CASE WHEN pk.ORDINAL_POSITION IS NULL THEN 0
                  ELSE 1
             END AS BIT) AS PrimaryKey,
        ISNULL(pk.ORDINAL_POSITION, 0) PrimaryKeyOrdinal,
        CAST(CASE WHEN fk.COLUMN_NAME IS NULL THEN 0
                  ELSE 1
             END AS BIT) AS IsForeignKey
FROM    INFORMATION_SCHEMA.COLUMNS c
        LEFT OUTER JOIN (SELECT u.TABLE_SCHEMA,
                                u.TABLE_NAME,
                                u.COLUMN_NAME,
                                u.ORDINAL_POSITION
                         FROM   INFORMATION_SCHEMA.KEY_COLUMN_USAGE u
                                INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
                                    ON u.TABLE_SCHEMA = tc.CONSTRAINT_SCHEMA
                                       AND u.TABLE_NAME = tc.TABLE_NAME
                                       AND u.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
                         WHERE  CONSTRAINT_TYPE = 'PRIMARY KEY') pk
            ON c.TABLE_SCHEMA = pk.TABLE_SCHEMA
               AND c.TABLE_NAME = pk.TABLE_NAME
               AND c.COLUMN_NAME = pk.COLUMN_NAME
        LEFT OUTER JOIN (SELECT DISTINCT
                                u.TABLE_SCHEMA,
                                u.TABLE_NAME,
                                u.COLUMN_NAME
                         FROM   INFORMATION_SCHEMA.KEY_COLUMN_USAGE u
                                INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
                                    ON u.TABLE_SCHEMA = tc.CONSTRAINT_SCHEMA
                                       AND u.TABLE_NAME = tc.TABLE_NAME
                                       AND u.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
                         WHERE  CONSTRAINT_TYPE = 'FOREIGN KEY') fk
            ON c.TABLE_SCHEMA = fk.TABLE_SCHEMA
               AND c.TABLE_NAME = fk.TABLE_NAME
               AND c.COLUMN_NAME = fk.COLUMN_NAME
        INNER JOIN INFORMATION_SCHEMA.TABLES t
            ON c.TABLE_SCHEMA = t.TABLE_SCHEMA
               AND c.TABLE_NAME = t.TABLE_NAME
WHERE c.TABLE_NAME NOT IN ('EdmMetadata', '__MigrationHistory')

Klucz obcy SQL:

SELECT  FK.name AS FK_Table,
        FkCol.name AS FK_Column,
        PK.name AS PK_Table,
        PkCol.name AS PK_Column,
        OBJECT_NAME(f.object_id) AS Constraint_Name,
        SCHEMA_NAME(FK.schema_id) AS fkSchema,
        SCHEMA_NAME(PK.schema_id) AS pkSchema,
        PkCol.name AS primarykey,
        k.constraint_column_id AS ORDINAL_POSITION
FROM    sys.objects AS PK
        INNER JOIN sys.foreign_keys AS f
            INNER JOIN sys.foreign_key_columns AS k
                ON k.constraint_object_id = f.object_id
            INNER JOIN sys.indexes AS i
                ON f.referenced_object_id = i.object_id
                   AND f.key_index_id = i.index_id
            ON PK.object_id = f.referenced_object_id
        INNER JOIN sys.objects AS FK
            ON f.parent_object_id = FK.object_id
        INNER JOIN sys.columns AS PkCol
            ON f.referenced_object_id = PkCol.object_id
               AND k.referenced_column_id = PkCol.column_id
        INNER JOIN sys.columns AS FkCol
            ON f.parent_object_id = FkCol.object_id
               AND k.parent_column_id = FkCol.column_id
ORDER BY FK_Table, FK_Column

Rozszerzone właściwości:

SELECT  s.name AS [schema],
        t.name AS [table],
        c.name AS [column],
        value AS [property]
FROM    sys.extended_properties AS ep
        INNER JOIN sys.tables AS t
            ON ep.major_id = t.object_id
        INNER JOIN sys.schemas AS s
            ON s.schema_id = t.schema_id
        INNER JOIN sys.columns AS c
            ON ep.major_id = c.object_id
               AND ep.minor_id = c.column_id
WHERE   class = 1
ORDER BY t.name
Simon Hughes
źródło
1

posługiwać się

SELECT COL_LENGTH('tablename', 'colname')

Żadne inne rozwiązanie nie działało dla mnie.

Pravin
źródło
wymaga to znajomości innych kolumn. Jest też literówka
ręcznie pisany
Naprawiono wycenę.
nikeee
1

Podoba mi się ten format:

name     DataType      Collation             Constraints         PK  FK          Comment

id       int                                 NOT NULL IDENTITY   PK              Order Line Id
pid      int                                 NOT NULL                tbl_orders  Order Id
itemCode varchar(10)   Latin1_General_CI_AS  NOT NULL                            Product Code

Więc użyłem tego:

DECLARE @tname varchar(100) = 'yourTableName';

SELECT  col.name,

        CASE typ.name
            WHEN 'nvarchar' THEN 'nvarchar('+CAST((col.max_length / 2) as varchar)+')'
            WHEN 'varchar' THEN 'varchar('+CAST(col.max_length as varchar)+')'
            WHEN 'char' THEN 'char('+CAST(col.max_length as varchar)+')'
            WHEN 'nchar' THEN 'nchar('+CAST((col.max_length / 2) as varchar)+')'
            WHEN 'binary' THEN 'binary('+CAST(col.max_length as varchar)+')'
            WHEN 'varbinary' THEN 'varbinary('+CAST(col.max_length as varchar)+')'
            WHEN 'numeric' THEN 'numeric('+CAST(col.precision as varchar)+(CASE WHEN col.scale = 0 THEN '' ELSE ','+CAST(col.scale as varchar) END) +')'
            WHEN 'decimal' THEN 'decimal('+CAST(col.precision as varchar)+(CASE WHEN col.scale = 0 THEN '' ELSE ','+CAST(col.scale as varchar) END) +')'
            ELSE typ.name
            END DataType,

        ISNULL(col.collation_name,'') Collation,

        CASE WHEN col.is_nullable = 0 THEN 'NOT NULL ' ELSE '' END + CASE WHEN col.is_identity = 1 THEN 'IDENTITY' ELSE '' END Constraints,

        ISNULL((SELECT 'PK'
                FROM    sys.key_constraints kc INNER JOIN
                        sys.tables tb ON tb.object_id = kc.parent_object_id INNER JOIN
                        sys.indexes si ON si.name = kc.name INNER JOIN
                        sys.index_columns sic ON sic.index_id = si.index_id AND sic.object_id = si.object_id
                WHERE kc.type = 'PK'
                  AND tb.name = @tname
                  AND sic.column_id = col.column_id),'') PK,

        ISNULL((SELECT (SELECT name FROM sys.tables st WHERE st.object_id = fkc.referenced_object_id)
                FROM    sys.foreign_key_columns fkc INNER JOIN
                        sys.columns c ON c.column_id = fkc.parent_column_id AND fkc.parent_object_id = c.object_id INNER JOIN
                        sys.tables t ON t.object_id = c.object_id
                WHERE t.name = tab.name
                  AND c.name = col.name),'') FK,

        ISNULL((SELECT value
                FROM sys.extended_properties
                WHERE major_id = tab.object_id
                  AND minor_id = col.column_id),'') Comment

FROM sys.columns col INNER JOIN
     sys.tables tab ON tab.object_id = col.object_id INNER JOIN
     sys.types typ ON typ.system_type_id = col.system_type_id
WHERE tab.name = @tname
  AND typ.name != 'sysname'
ORDER BY col.column_id;
Graham
źródło
1
SELECT C.COLUMN_NAME, C.IS_NULLABLE, C.DATA_TYPE, TC.CONSTRAINT_TYPE, C.COLUMN_DEFAULT
    FROM INFORMATION_SCHEMA.COLUMNS AS C
    FULL JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS CC ON C.COLUMN_NAME = CC.COLUMN_NAME 
    FULL JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC ON CC.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
WHERE C.TABLE_NAME = '<Table Name>';

Przykładowe dane wyjściowe

Abhishek Khanna
źródło
Witamy w SO! Odpowiadając na pytanie, spróbuj trochę wyjaśnić swoją odpowiedź. W twoim przypadku jest jeszcze 16 odpowiedzi, więc powinieneś ujawnić zalety i wady swojej odpowiedzi
David García Bodego
1

Jeśli używasz FirstResponderKit z zespołu Brent Ozar , możesz uruchomić to zapytanie również:

exec sp_blitzindex @tablename='MyTable'

Zwróci wszystkie informacje o tabeli:

  • indeksy z ich statystykami użytkowania (odczyty, zapisy, blokady itp.), wykorzystaną przestrzeń i inne
  • brakujące indeksy
  • kolumny
  • klucz obcy
  • zawartość statystyki próbka sp_BlitzIndex

Oczywiście nie jest to system i nie tak uniwersalny stp, jak sp_help lub sp_columns , ale zwraca wszystkie możliwe informacje o twoim stole i myślę, że warto go stworzyć w swoim środowisku i wspomnieć o tym tutaj.

Dmitriy Grishin - dogrishin
źródło
1

Wystarczy dwukrotnie kliknąć nazwę tabeli i nacisnąć Alt + F1

mannedear
źródło
0
CREATE PROCEDURE [dbo].[describe] 
( 
@SearchStr nvarchar(max) 
) 
AS 
BEGIN 
SELECT  
    CONCAT([COLUMN_NAME],' ',[DATA_TYPE],' ',[CHARACTER_MAXIMUM_LENGTH],' ', 
    (SELECT CASE [IS_NULLABLE] WHEN 'NO' THEN 'NOT NULL' ELSE 'NULL' END),
    (SELECT CASE WHEN [COLUMN_DEFAULT] IS NULL THEN '' ELSE CONCAT(' DEFAULT ',[COLUMN_DEFAULT]) END)
    ) AS DESCRIPTION
    FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE @SearchStr
END 
Brian Somerfield
źródło