Truy vấn máy chủ SQL để lấy danh sách các cột trong bảng cùng với các loại Dữ liệu, KHÔNG ràng buộc NULL và các ràng buộc CHÍNH CHÍNH


229

Tôi cần phải viết một truy vấn trên máy chủ SQL để lấy danh sách các cột trong một bảng cụ thể, các kiểu dữ liệu liên quan của nó (có độ dài) và nếu chúng không phải là null. Và tôi đã quản lý để làm điều này nhiều.

Nhưng bây giờ tôi cũng cần lấy, trong cùng một bảng, dựa vào một cột - TRUEnếu cột đó là khóa chính.

Làm thế nào để tôi làm điều này?

Sản lượng dự kiến ​​của tôi là:

Column name | Data type | Length | isnull | Pk

2
Bạn có thể hiển thị mã bạn đã có?
DOK

Câu trả lời:


478

Để tránh các hàng trùng lặp cho một số cột, hãy sử dụng user_type_id thay vì 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')

Chỉ cần thay thế YourTableNamebằng tên bảng thực tế của bạn - hoạt động cho SQL Server 2005 trở lên.

Trong trường hợp bạn đang sử dụng lược đồ, thay thế YourTableName bởi YourSchemaName.YourTableNamenơi YourSchemaNamelà tên schema thực tế và YourTableNamelà tên bảng thực tế.


2
Điều này cung cấp độ dài sai cho loại cột nvarchar, vv. Nó cho độ dài byte gấp đôi chiều dài của kiểu cột.
Andrew Savinykh

14
Độ dài đó không sai - nó cho độ dài byte - đó là độ dài tối đa có thể tính bằng byte ... nếu bạn muốn tính toán dung lượng, v.v., đó là độ dài bạn muốn nhận ....
marc_s

2
Hoạt động tuyệt vời đối với tôi SQL Server 2012 :)
Doc Holiday

2
WHERE c.object_id = OBJECT_ID ('YourTableName') .... Tôi cần WHERE c.object_id = OBJECT_ID ('MySchema.MyTableName') và sau đó mọi thứ đều hoạt động tốt.
Ivan

7
Truy vấn này trả về các cột trùng lặp nếu bạn có nhiều chỉ mục liên quan đến cùng một cột. Để khắc phục, thay thế hai lần tham gia cuối cùng bằng cách sau: LEFT OUTER JOIN sys.index_columns ic LEFT OUTER JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id ON ic.object_id = c.object_id AND ic.column_id = c.column_id AND i.is_primary_key=1
Razvan Socol


72

Bạn có thể sử dụng truy vấn:

select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, 
       NUMERIC_PRECISION, DATETIME_PRECISION, 
       IS_NULLABLE 
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='TableName'

để có được tất cả các siêu dữ liệu bạn yêu cầu ngoại trừ thông tin về LOL.


2
tôi đã làm điều đó :) Nhưng tôi cũng cần PK: |
Shrayas

msdn.microsoft.com/pt-br/l Library / ms189813 (v = sql.120) .aspx sp_fkeys sp_pkeys
Leonardo Marques de Souza

1
Điều này thật tuyệt vì nó hoạt động với các phiên bản SS cũ hơn năm 2005. Cảm ơn!
Karl Hoaglund

19

Trong SQL 2012, bạn có thể sử dụng:

EXEC sp_describe_first_result_set N'SELECT * FROM [TableName]'

Điều này sẽ cung cấp cho bạn các tên cột cùng với các thuộc tính của chúng.


13

Thử cái này:

select COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE 
from INFORMATION_SCHEMA.COLUMNS IC
where TABLE_NAME = 'tablename' and COLUMN_NAME = 'columnname'

2
Câu trả lời của bạn khác với câu trả lời của Ajadex như thế nào? Cả hai câu trả lời không trả về thông tin Chính.
Artemix

10

Để đảm bảo bạn có được độ dài phù hợp, bạn sẽ cần xem xét các loại unicode như một trường hợp đặc biệt. Xem mã dưới đây.

Để biết thêm thông tin, hãy xem: https://msdn.microsoft.com/en-us/l Library / ms176106.aspx

SELECT 
   c.name 'Column Name',
   t.name,
   t.name +
   CASE WHEN t.name IN ('char', 'varchar','nchar','nvarchar') THEN '('+

             CASE WHEN c.max_length=-1 THEN 'MAX'

                  ELSE CONVERT(VARCHAR(4),

                               CASE WHEN t.name IN ('nchar','nvarchar')

                               THEN  c.max_length/2 ELSE c.max_length END )

                  END +')'

          WHEN t.name IN ('decimal','numeric')

                  THEN '('+ CONVERT(VARCHAR(4),c.precision)+','

                          + CONVERT(VARCHAR(4),c.Scale)+')'

                  ELSE '' END

   as "DDL name",
   c.max_length 'Max Length in Bytes',
   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')

1
Tên DDL là SO hữu ích cho động-sql tạo bảng! Cảm ơn!!
George Menoutis

6

Mở rộng câu trả lời của Alex, bạn có thể làm điều này để có được ràng buộc 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'

Tôi đã phải bỏ lỡ rằng bạn muốn một cờ để xác định xem cột đã cho có phải là một phần của PK thay vì tên của ràng buộc PK hay không. Cho rằng bạn sẽ sử dụng:

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'

tốt. Nó không cho tôi kết quả bắt buộc :(
Shrayas

5

chọn tên bảng trong trình soạn thảo truy vấn, chọn tên và nhấn Alt + F1 và nó sẽ mang tất cả thông tin của bảng.


Anh ta yêu cầu một truy vấn, nhưng bạn đúng theo cách này cho phép bạn xem tất cả các thông tin.
Rafa Barragan

nhưng vẫn; siêu gọn gàng :-)
netfed

4
SELECT COLUMN_NAME, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM information_schema.columns WHERE table_name = '<name_of_table_or_view>'

Chạy SELECT *trong câu lệnh trên để xem thông tin nào_schema.columns trả về.

Câu hỏi này đã được trả lời trước đây - https://stackoverflow.com/a/11268456/6169225


nếu câu hỏi này đã được trả lời, hãy gắn cờ bài viết dưới dạng trùng lặp .
Martijn Pieters


3
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES 
     WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Table')
      BEGIN
        SELECT COLS.COLUMN_NAME, COLS.DATA_TYPE, COLS.CHARACTER_MAXIMUM_LENGTH, 
              (SELECT 'Yes' FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU
                              ON COLS.TABLE_NAME = TC.TABLE_NAME 
                             AND TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
                             AND KCU.TABLE_NAME = TC.TABLE_NAME
                             AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
                             AND KCU.COLUMN_NAME = COLS.COLUMN_NAME) AS KeyX
        FROM INFORMATION_SCHEMA.COLUMNS COLS WHERE TABLE_NAME = 'Table' ORDER BY KeyX DESC, COLUMN_NAME
      END

3

Ném một câu trả lời khác vào vòng, điều này sẽ cung cấp cho bạn các cột đó và hơn thế nữa:

SELECT col.TABLE_CATALOG AS [Database]
     , col.TABLE_SCHEMA AS Owner
     , col.TABLE_NAME AS TableName
     , col.COLUMN_NAME AS ColumnName
     , col.ORDINAL_POSITION AS OrdinalPosition
     , col.COLUMN_DEFAULT AS DefaultSetting
     , col.DATA_TYPE AS DataType
     , col.CHARACTER_MAXIMUM_LENGTH AS MaxLength
     , col.DATETIME_PRECISION AS DatePrecision
     , CAST(CASE col.IS_NULLABLE
                WHEN 'NO' THEN 0
                ELSE 1
            END AS bit)AS IsNullable
     , COLUMNPROPERTY(OBJECT_ID('[' + col.TABLE_SCHEMA + '].[' + col.TABLE_NAME + ']'), col.COLUMN_NAME, 'IsIdentity')AS IsIdentity
     , COLUMNPROPERTY(OBJECT_ID('[' + col.TABLE_SCHEMA + '].[' + col.TABLE_NAME + ']'), col.COLUMN_NAME, 'IsComputed')AS IsComputed
     , CAST(ISNULL(pk.is_primary_key, 0)AS bit)AS IsPrimaryKey
  FROM INFORMATION_SCHEMA.COLUMNS AS col
       LEFT JOIN(SELECT SCHEMA_NAME(o.schema_id)AS TABLE_SCHEMA
                      , o.name AS TABLE_NAME
                      , c.name AS COLUMN_NAME
                      , i.is_primary_key
                   FROM sys.indexes AS i JOIN sys.index_columns AS ic ON i.object_id = ic.object_id
                                                                     AND i.index_id = ic.index_id
                                         JOIN sys.objects AS o ON i.object_id = o.object_id
                                         LEFT JOIN sys.columns AS c ON ic.object_id = c.object_id
                                                                   AND c.column_id = ic.column_id
                  WHERE i.is_primary_key = 1)AS pk ON col.TABLE_NAME = pk.TABLE_NAME
                                                  AND col.TABLE_SCHEMA = pk.TABLE_SCHEMA
                                                  AND col.COLUMN_NAME = pk.COLUMN_NAME
 WHERE col.TABLE_NAME = 'YourTableName'
   AND col.TABLE_SCHEMA = 'dbo'
 ORDER BY col.TABLE_NAME, col.ORDINAL_POSITION;

2
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

Để tìm kiếm cột nào trong bảng nào dựa trên loại dữ liệu tìm kiếm của bạn cho ba bảng khác nhau trong một cơ sở dữ liệu. Truy vấn này có thể mở rộng thành các bảng 'n'.


2

Tìm kết quả kết hợp cho Kiểu dữ liệu và Độ dài và không thể thực hiện được dưới dạng "NULL" và "Không null" Sử dụng truy vấn bên dưới.

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

bạn sẽ tìm thấy kết quả như hình dưới đây.

nhập mô tả hình ảnh ở đây

Cảm ơn bạn.


1
tình trạng ràng buộc của bạn nên theo cách khác.
Allen

0
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

1
Vui lòng sử dụng thụt lề thay vì Đánh dấu nội tuyến và thêm một số giải thích cho câu trả lời của bạn.
Toxantron

Tại sao ĐẶT HÀNG B 2NG 2?
reggaeg Ức

0

nhập mô tả hình ảnh ở đây

Truy vấn: EXEC SP_DESCRIBE_FIRST_RESULT_SET N'SELECT ANNUAL_INCOME TỪ [BSLID2C]. [DBO]. [NHÂN VIÊN] '

LƯU Ý: TRONG MỘT SỐ IDE TRƯỚC KHI CHỌN N ĐANG LÀM VIỆC HOẶC, TRONG MỘT SỐ IDE KHÔNG CÓ N KHÔNG LÀM VIỆC


0

Không có khóa chính ở đây, nhưng điều này có thể giúp những người dùng khác muốn có tên bảng với tên trường và thuộc tính trường cơ bản

USE [**YourDB**]
GO
SELECT tbl.name, fld.[Column Name],fld.[Constraint],fld.DataType 
FROM sys.all_objects as tbl left join 
(SELECT c.OBJECT_ID,  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
) as fld on tbl.OBJECT_ID = fld.OBJECT_ID
WHERE ( tbl.[type]='U' and tbl.[is_ms_shipped] = 0)
ORDER BY tbl.[name],fld.[Column Name]
GO

-1

Tôi chỉ làm marc_s "trình bày sẵn sàng":

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