Was entspricht "Tabelle beschreiben" in SQL Server?

321

Ich habe eine SQL Server-Datenbank und möchte wissen, welche Spalten und Typen sie hat. Ich würde dies lieber über eine Abfrage tun, als eine grafische Benutzeroberfläche wie Enterprise Manager zu verwenden. Gibt es eine Möglichkeit, dies zu tun?

marc_s
quelle
1
Ein anderer Stackoverflow [Frage] [1] hat dies beantwortet [1]: stackoverflow.com/questions/11078106/…
Shiva
Ich verstehe nicht, warum Microsoft diese Option nicht vorher eingestellt hat. Dies muss Funktionalität haben.
Sukumaar

Antworten:

342

Sie können die gespeicherte Prozedur sp_columns verwenden:

exec sp_columns MyTable
Vincent Ramdhanie
quelle
1
Danke - ich wollte die gleiche Frage mit T-SQL anstelle von MSSQL stellen.
Jedidja
11
Nur eine kurze Anmerkung: Setzen Sie den Tabellennamen nicht in Anführungszeichen und verwenden Sie nicht die TableOwner.TableName-Syntax.
Gezim
1
Sehen Sie hier, ob Sie beim Ausführen dieser Abfrage keine Ergebnisse erhalten.
mlissner
12
Verwenden Sie Select * From INFORMATION_SCHEMA.COLUMNS Wobei TABLE_NAME = 'TABLENAME', wenn Sie keine gespeicherte Prozedur verwenden möchten
Matias Elorriaga
1
Die Ausgabe von sp_columns ist in sqlcmd selbst bei enormen Terminalbreiten lächerlich unlesbar. Die selectunten aufgeführten Lösungen eignen sich viel besser für Benutzer von sqlcmd.
Ctpenrose
123

Es gibt einige Methoden, um Metadaten zu einer Tabelle abzurufen:

EXEC sp_help tablename

Gibt mehrere Ergebnismengen zurück, die die Tabelle, ihre Spalten und Einschränkungen beschreiben.

Die INFORMATION_SCHEMAAnsichten geben Ihnen die gewünschten Informationen, obwohl Sie die Ansichten leider abfragen und manuell verbinden müssen.

Brannon
quelle
7
Für mich funktionierte es ohne das "@" Zeichen EXEC sp_help 'table_name'
Ali
Dies ist eine korrektere Version von Viranjas Antwort. Die @Syntax ist jedoch falsch.
PCNATE
Es sieht so aus, als wäre @tablenamees eine Variable im Beispiel. Das sp funktioniert in beide Richtungen, entweder mit einer Zeichenfolge oder dem 'einfachen' Tabellennamen ( exec sp_help Employeesoder exec sp_help 'Employees')
KekuSemau
Zu execute sp_help 'db.sch.your_table
Ihrer Information
53

Nur für den Fall, dass Sie keinen gespeicherten Prozess verwenden möchten, finden Sie hier eine einfache Abfrageversion

select * 
  from information_schema.columns 
 where table_name = 'aspnet_Membership'
 order by ordinal_position
Salamander2007
quelle
1
In meinem Fall gilt dies auch, wenn diese gespeicherten Prozesse aus irgendeinem Grund nicht verfügbar sind.
James Mills
Der gespeicherte Prozess ist unflexibel und sehr feindlich gegenüber naiven sqlcmd-Benutzern wie mir
ctpenrose
liebe dieses, wie es mit Namen bestellt: D
Marin
33

Sie können Folgendes verwenden

sp_help tablename

Beispiel: sp_help Kunde

ODER Verwenden Sie die Verknüpfung

  • Tabelle auswählen Alt + F1 drücken

Beispiel: Kunde Drücken Sie Alt + F1

Viranja kaushalya
quelle
Beachten Sie, dass Sie die Tabelle, wenn Sie sie in einem benutzerdefinierten Schema haben, von der Abfrage ausschließen sollten. Alle Schemata, die eine Tabelle mit diesem Namen enthalten, werden in der Ergebnismenge in einer Spalte mit dem Namen "TABLE_OWNER" angezeigt.
Buggieboy
Beachten Sie, dass die Tabelle / Ansicht / Prozedur vollständig ausgewählt sein muss, damit die Verknüpfung funktioniert. SSMS erweitert die Auswahl nicht automatisch (das hätte ich erwartet). Ctrl+Wkann verwendet werden, um die Auswahl zu erweitern und den gesamten Namen auszuwählen.
Bugybunny
29

Verwenden Sie diese Abfrage

Select * From INFORMATION_SCHEMA.COLUMNS Where TABLE_NAME = 'TABLENAME'
Sukhi
quelle
1
Funktioniert für mich, wenn Sie zuerst "MyDatabase verwenden" sagen.
Jason D
Ich mag das, weil es auch unter MySQL funktioniert, so dass ich mein SQL in meinem Code nicht ändern muss
Abdul
1
Diese Antwort unterscheidet sich nicht von stackoverflow.com/a/319424/695671, das 5 Jahre zuvor kam. Ich finde wiederholte Antworten nicht nützlich.
Jason S
15

Zusätzlich zu den in anderen Antworten gezeigten Möglichkeiten können Sie verwenden

SELECT TOP 0 * FROM table_name

Dies gibt Ihnen den Namen jeder Spalte ohne Ergebnisse und wird fast sofort mit minimalem Aufwand abgeschlossen.

kingfrito_5005
quelle
TOP 1 würde auch Beispieldaten liefern, die veranschaulichender sein könnten.
Spurgeon
14

Bitte verwenden Sie die folgende SQL-Abfrage; Das hat bei meinem Fall funktioniert.

select * FROM   INFORMATION_SCHEMA.Columns where table_name = 'tablename';
Abhijeet
quelle
2
Die gleiche Antwort wurde 2008 und 2014 gegeben. Ich finde wiederholte Antworten nicht nützlich.
Jason S
14

Wählen Sie einfach Tabelle und drücken Sie Alt+ F1,

Es werden alle Informationen zu Tabellen wie Spaltenname, Datentyp, Schlüssel usw. angezeigt.

Shwetank Suthar
quelle
7
OP fragte nach einer GUI-
freien
Das funktionierte nicht mit SQL Server Management Studio
Prasad
7

Ich habe ein SQL * plus DESC (RIBE) wie select (zeigt auch die Spaltenkommentare an) in t-sql geschrieben:

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];

Die oben erwähnte Auswahl kann in einer vom System gekennzeichneten gespeicherten Prozedur verwendet werden und kann auf einfache Weise aus jeder Datenbank Ihrer Instanz aufgerufen werden:

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

So führen Sie den Prozedurtyp aus:

EXEC sp_desc 'YourDB.YourSchema.YourTable';

Wenn Sie eine Beschreibung eines Objekts der aktuellen Datenbank (und des Schemas) erhalten möchten, geben Sie einfach Folgendes ein:

EXEC sp_desc 'YourTable';

Da sp_desc eine vom System markierte Prozedur ist, können Sie auch den Befehl exec verlassen (ohnehin nicht empfohlen):

sp_desc 'YourTable';
Zsolt Hidasi
quelle
6

Der SQL Server, der dem describeBefehl von Oracle entspricht, ist der gespeicherte Prozesssp_help

Der describeBefehl gibt Ihnen Informationen zu Spaltennamen, -typen, -länge usw. an.

Angenommen, Sie möchten in SQL Server eine Tabelle 'mytable' im Schema 'myschema' in der Datenbank 'mydb' beschreiben. Sie können Folgendes tun:

USE mydb;
exec sp_help 'myschema.mytable';
VHS
quelle
5

Sie können den sp_help 'TableName' verwenden.

user3819354
quelle
2

Das Problem mit diesen Antworten ist, dass Sie die wichtigsten Informationen vermissen. Dies ist zwar etwas chaotisch, aber es handelt sich um eine schnelle Version, die ich entwickelt habe, um sicherzustellen, dass sie dieselben Informationen enthält, die MySQL Describe anzeigt.

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')

quelle
Gibt es einen Grund, warum is_primary_key niemals einen Wert haben würde?
Michael
2

Dies ist der Code, den ich in EntityFramework Reverse POCO Generator( hier verfügbar ) verwende.

Tabelle 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')

Fremdschlüssel-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

Erweiterte Eigenschaften:

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
quelle
1

verwenden

SELECT COL_LENGTH('tablename', 'colname')

Keine andere Lösung hat bei mir funktioniert.

Pravin
quelle
Dies setzt voraus, dass Sie die anderen Spalten kennen. Auch gibt es aa Tippfehler
pcnate
Das Zitat wurde korrigiert.
Nikeee
1

Ich mag dieses 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

Also habe ich das benutzt:

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
quelle
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>';

Beispielausgabe

abhishek khanna
quelle
Willkommen bei SO! Wenn Sie auf eine Frage antworten, versuchen Sie, Ihre Antwort ein wenig zu erklären. In Ihrem Fall gibt es 16 weitere Antworten, daher sollten Sie die Vor- und Nachteile Ihrer Antwort
offenlegen
1

Wenn Sie FirstResponderKit vom Brent Ozar-Team verwenden, können Sie diese Abfrage auch ausführen:

exec sp_blitzindex @tablename='MyTable'

Es werden alle Informationen zur Tabelle zurückgegeben:

  • Indizes mit ihren Nutzungsstatistiken (Lesen, Schreiben, Sperren usw.), verwendetem Speicherplatz und anderem
  • fehlende Indizes
  • Säulen
  • fremde Schlüssel
  • Statistikinhalte sp_BlitzIndex-Beispiel

Natürlich ist es kein System und kein so universeller STP wie sp_help oder sp_columns , aber es gibt alle möglichen Informationen über Ihre Tabelle zurück, und ich denke, es lohnt sich, sie in Ihrer Umgebung zu erstellen und hier zu erwähnen.

Dmitriy Grishin - Dogrishin
quelle
1

Doppelklicken Sie einfach auf den Tabellennamen und drücken Sie Alt + F1

bemannt
quelle
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
quelle