Tương đương với 'bảng mô tả' trong SQL Server là gì?


321

Tôi có một cơ sở dữ liệu SQL Server và tôi muốn biết nó có các cột và loại nào. Tôi muốn thực hiện điều này thông qua truy vấn hơn là sử dụng GUI như Enterprise Manager. Có cách nào để làm việc này không?


1
Một stackoverflow [câu hỏi] [1] có này đã trả lời [1]: stackoverflow.com/questions/11078106/...
Shiva

Tôi không hiểu tại sao Microsoft không đặt tùy chọn này trước. Đây là phải có chức năng.
Sukumaar

Câu trả lời:


342

Bạn có thể sử dụng thủ tục lưu trữ sp_columns :

exec sp_columns MyTable

1
Cảm ơn - Tôi đã định đăng cùng một câu hỏi với T-SQL thay vì MSSQL.
Jedidja

11
Chỉ cần một lưu ý nhanh: không đặt tên bảng trong dấu ngoặc kép và không sử dụng cú pháp TableOwner.TableName.
Gezim

1
Xem ở đây nếu bạn không nhận được kết quả khi bạn chạy truy vấn này.
mlissner

12
sử dụng Chọn * Từ THÔNG TIN_SCHema.COLUMNS Trong đó TABLE_NAME = 'TABLENAME' nếu bạn không muốn sử dụng quy trình được lưu trữ
Matias Elorriaga

1
Đầu ra từ sp_columns không thể đọc được trong sqlcmd ngay cả khi sử dụng chiều rộng thiết bị đầu cuối khổng lồ. Các giải pháp sử dụng selectđược tìm thấy dưới đây phù hợp hơn nhiều cho người dùng sqlcmd.
ctpenrose

123

Có một vài phương pháp để lấy siêu dữ liệu về một bảng:

EXEC sp_help tablename

Sẽ trả về một số tập kết quả, mô tả bảng, đó là các cột và các ràng buộc.

Các INFORMATION_SCHEMAlượt xem sẽ cung cấp cho bạn thông tin bạn muốn, mặc dù không may là bạn phải truy vấn các lượt xem và tham gia chúng theo cách thủ công.


7
Đối với tôi, nó hoạt động mà không có ký tự "@" EXEC sp_help 'tên_bảng'
Ali

đây là phiên bản chính xác hơn cho câu trả lời của Viranja. Các @là cú pháp không chính xác tuy nhiên.
pcnate

Có vẻ như @tablenamelà một biến trong ví dụ. Sp hoạt động theo cả hai cách, với một chuỗi hoặc tablename 'plain' ( exec sp_help Employeeshoặc exec sp_help 'Employees')
KekuSemau

FYI: Schema (và thậm chí cả Cơ sở dữ liệu) có thể đi trong tích tắc:execute sp_help 'db.sch.your_table
ColinMac

53

Chỉ trong trường hợp bạn không muốn sử dụng Proc được lưu trữ, đây là phiên bản truy vấn đơn giản

select * 
  from information_schema.columns 
 where table_name = 'aspnet_Membership'
 order by ordinal_position

1
Trong trường hợp của tôi, điều này cũng áp dụng nếu vì một lý do nào đó những procs được lưu trữ không có sẵn.
James Mills

Các Proc được lưu trữ là không linh hoạt và thực sự thù địch với những người dùng sqlcmd ngây thơ như tôi
ctpenrose

yêu cái này vì nó đặt hàng theo tên: D
Marin

33

Bạn có thể sử dụng sau đây

trợ giúp tablename

Ví dụ: sp_help Khách hàng

HOẶC Sử dụng Phím tắt

  • chọn bảng nhấn Alt + F1

Ví dụ: Khách hàng Nhấn Alt + F1


Lưu ý rằng, nếu bạn có bảng trong lược đồ do người dùng xác định, bạn nên loại trừ nó khỏi truy vấn. Tất cả các lược đồ chứa một bảng có tên này sẽ xuất hiện trong một cột có tên "TABLE_OWNER" trong tập kết quả.
Buggieboy

Lưu ý rằng để phím tắt hoạt động, bảng / khung nhìn / thủ tục phải được chọn đầy đủ. SSMS không tự động mở rộng lựa chọn (tôi đã mong đợi điều đó). Ctrl+Wcó thể được sử dụng để mở rộng lựa chọn và chọn toàn bộ tên.
bugybunny

29

Sử dụng truy vấn này

Select * From INFORMATION_SCHEMA.COLUMNS Where TABLE_NAME = 'TABLENAME'

1
Hoạt động với tôi nếu bạn nói "sử dụng MyDatabase" trước.
Jason D

Tôi thích điều này vì nó cũng hoạt động trên MySQL, vì vậy tôi không phải thay đổi SQL trong mã của mình
Abdul

1
Câu trả lời này không khác gì với stackoverflow.com/a/319424/695671 đã xuất hiện 5 năm trước. Tôi không tìm thấy câu trả lời lặp đi lặp lại hữu ích.
Jason S

15

Ngoài những cách thể hiện trong các câu trả lời khác, bạn có thể sử dụng

SELECT TOP 0 * FROM table_name

Điều này sẽ cung cấp cho bạn tên của từng cột không có kết quả trong đó và hoàn thành gần như ngay lập tức với chi phí tối thiểu.


TOP 1 cũng sẽ cung cấp một dữ liệu mẫu, có thể mang tính minh họa hơn.
Spurgeon

14

Vui lòng sử dụng truy vấn sql sau đây; Điều này làm việc cho trường hợp của tôi.

select * FROM   INFORMATION_SCHEMA.Columns where table_name = 'tablename';

2
Câu trả lời tương tự đã được đưa ra vào năm 2008 và 2014. Tôi không thấy câu trả lời lặp đi lặp lại hữu ích.
Jason S

14

Chỉ cần chọn bảng và nhấn Alt+ F1,

nó sẽ hiển thị tất cả các thông tin về bảng như tên cột, kiểu dữ liệu, khóa, v.v.


7
OP đã yêu cầu một phương pháp không có GUI
Spikolynn

7

Tôi đã viết một sql * cộng với DESC (RIBE) như select (cũng hiển thị các bình luận cột) trong 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];

Lựa chọn được đề cập ở trên có thể được sử dụng trong một hệ thống được đánh dấu thủ tục lưu trữ và nó có thể được gọi từ bất kỳ cơ sở dữ liệu nào của cá thể bạn theo cách đơn giản:

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

Để thực hiện loại thủ tục:

EXEC sp_desc 'YourDB.YourSchema.YourTable';

Nếu bạn muốn lấy một mô tả một đối tượng của cơ sở dữ liệu hiện tại (và lược đồ) loại đơn giản:

EXEC sp_desc 'YourTable';

Vì sp_desc là một thủ tục được đánh dấu hệ thống, bạn thậm chí có thể rời khỏi lệnh exec (dù sao cũng không được đề xuất):

sp_desc 'YourTable';

6

Máy chủ SQL tương đương với describelệnh của Oracle là Proc được lưu trữsp_help

Các describe lệnh cung cấp cho bạn các thông tin về tên cột, chủng loại, chiều dài vv

Trong SQL Server, giả sử bạn muốn mô tả bảng 'mytable' trong lược đồ 'myschema' trong cơ sở dữ liệu 'mydb', bạn có thể thực hiện như sau:

USE mydb;
exec sp_help 'myschema.mytable';


2

Vấn đề với những câu trả lời là bạn đang thiếu thông tin chính. Mặc dù điều này hơi lộn xộn, đây là một phiên bản nhanh mà tôi đã đưa ra để đảm bảo rằng nó chứa cùng thông tin mà MySQL Describe hiển thị.

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

Có bất kỳ lý do tại sao is_primary_key sẽ không bao giờ có giá trị?
Michael

2

Đây là mã tôi sử dụng trong EntityFramework Reverse POCO Generator(có sẵn ở đây )

Bảng 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')

SQL khóa ngoài:

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

Thuộc tính mở rộng:

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

1

sử dụng

SELECT COL_LENGTH('tablename', 'colname')

Không có giải pháp nào khác làm việc cho tôi.


điều này đòi hỏi phải biết các cột khác là gì. Ngoài ra còn có một lỗi đánh máy
pcnate

Đã sửa báo giá.
nikeee

1

Tôi thích định dạng này:

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

Vì vậy, tôi đã sử dụng điều này:

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;

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

Đầu ra mẫu


Chào mừng đến với SO! Khi bạn trả lời một câu hỏi, hãy cố gắng giải thích câu trả lời của bạn một chút. Trong trường hợp của bạn, có thêm 16 câu trả lời, vì vậy bạn nên tiết lộ Ưu và nhược điểm của câu trả lời của mình
David García Bodego

1

Nếu bạn đang sử dụng FirstResponderKit từ nhóm Brent Ozar, bạn cũng có thể chạy truy vấn này:

exec sp_blitzindex @tablename='MyTable'

Nó sẽ trả về tất cả thông tin về bảng:

  • chỉ mục với số liệu thống kê sử dụng của họ (đọc, ghi, khóa, v.v.), không gian được sử dụng và khác
  • thiếu chỉ số
  • cột
  • khóa ngoại
  • nội dung thống kê mẫu sp_Blitz Index

Tất nhiên đó không phải là một hệ thống và không quá phổ biến như sp_help hoặc sp_columns , nhưng nó trả về tất cả thông tin có thể có về bảng của bạn và tôi nghĩ rằng nó đáng để tạo ra nó trong môi trường của bạn và đề cập đến nó ở đây.



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 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.