SQL server query untuk mendapatkan daftar kolom dalam tabel bersama dengan tipe data, BUKAN NULL, dan kendala UTAMA


229

Saya perlu menulis kueri di SQL server untuk mendapatkan daftar kolom dalam tabel tertentu, tipe datanya yang terkait (dengan panjang) dan jika tidak nol. Dan saya telah berhasil melakukan ini.

Tapi sekarang saya juga perlu mendapatkan, dalam tabel yang sama, terhadap kolom - TRUEjika kolom itu adalah kunci utama.

Bagaimana saya melakukan ini?

Output yang saya harapkan adalah:

Column name | Data type | Length | isnull | Pk

2
Bisakah Anda menunjukkan kode yang sudah Anda miliki?
DOK

Jawaban:


478

Untuk menghindari duplikat baris untuk beberapa kolom, gunakan user_type_id alih-alih 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')

Ganti saja YourTableNamedengan nama tabel Anda yang sebenarnya - berfungsi untuk SQL Server 2005 dan yang lebih tinggi.

Jika Anda menggunakan skema, ganti YourTableName dengan di YourSchemaName.YourTableNamemana YourSchemaNamenama skema aktual dan YourTableNamenama tabel sebenarnya.


2
Ini memberikan panjang yang salah untuk jenis kolom nvarchar, dll. Ini memberikan panjang byte yang dua kali lipat dari panjang dalam jenis kolom.
Andrew Savinykh

14
Mereka panjang yang tidak salah - itu tidak memberikan panjang byte - itu mungkin panjang maksimum dalam bytes ... jika Anda ingin menghitung ruang dll, itu panjang Anda ingin mendapatkan ....
marc_s

2
Bekerja sangat baik untuk saya SQL Server 2012 :)
Doc Holiday

2
WHERE c.object_id = OBJECT_ID ('YourTableName') .... Saya membutuhkan WHERE c.object_id = OBJECT_ID ('MySchema.MyTableName') dan kemudian semuanya bekerja dengan baik.
Ivan

7
Kueri ini mengembalikan kolom yang digandakan jika Anda memiliki beberapa indeks yang melibatkan kolom yang sama. Untuk memperbaikinya, ganti dua gabungan terakhir dengan yang berikut: 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

Anda dapat menggunakan kueri:

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

untuk mendapatkan semua metadata yang Anda butuhkan kecuali untuk informasi Pk.


2
saya melakukan itu :) Tapi saya butuh PK juga: |
Shrayas


1
Ini hebat karena berfungsi dengan versi SS yang lebih tua dari tahun 2005. Terima kasih!
Karl Hoaglund

19

Di SQL 2012 Anda dapat menggunakan:

EXEC sp_describe_first_result_set N'SELECT * FROM [TableName]'

Ini akan memberi Anda nama kolom beserta propertinya.


13

Coba ini:

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

2
Bagaimana jawaban Anda berbeda dari yang diposting oleh Ajadex? Kedua jawaban tidak mengembalikan informasi Kunci Utama.
Artemix

10

Untuk memastikan Anda mendapatkan panjang yang tepat, Anda perlu mempertimbangkan jenis unicode sebagai kasus khusus. Lihat kode di bawah ini.

Untuk informasi lebih lanjut, lihat: https://msdn.microsoft.com/en-us/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
Nama DDL sangat berguna untuk dynamic-sql yang membuat tabel! Terima kasih!!
George Menoutis

6

Memperluas jawaban Alex, Anda dapat melakukan ini untuk mendapatkan batasan 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'

Saya pasti lupa bahwa Anda ingin bendera menentukan apakah kolom yang diberikan adalah bagian dari PK, bukan nama batasan PK. Untuk itu Anda akan menggunakan:

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'

baik. Itu tidak memberi saya hasil yang diperlukan :(
Shrayas

5

Wite nama tabel di editor query pilih nama dan tekan Alt + F1 dan itu akan membawa semua informasi dari tabel.


Dia meminta pertanyaan, tetapi Anda benar dengan cara ini memungkinkan Anda untuk melihat semua info.
Rafa Barragan

tetapi tetap saja; super rapi :-)
netfed

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

Jalankan SELECT *dalam pernyataan di atas untuk melihat kembali information_schema.columns.

Pertanyaan ini sebelumnya telah dijawab - https://stackoverflow.com/a/11268456/6169225


jika pertanyaan ini sudah dijawab, tandai tulisan sebagai duplikat .
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

Melemparkan jawaban lain ke dalam ring, ini akan memberi Anda kolom itu dan banyak lagi:

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

Untuk mencari kolom mana di tabel mana berdasarkan pada tipe data pencarian Anda untuk tiga tabel berbeda dalam satu database. Kueri ini dapat diperluas ke tabel 'n'.


2

Temukan hasil gabungan untuk Datatype dan Panjang dan nullable dalam bentuk "NULL" dan "Tidak null" Gunakan kueri di bawah ini.

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

Anda akan menemukan hasil seperti yang ditunjukkan di bawah ini.

masukkan deskripsi gambar di sini

Terima kasih.


1
kondisi Kendala Anda harus sebaliknya.
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
Silakan gunakan indentasi alih-alih inline Markup dan tambahkan beberapa penjelasan pada jawaban Anda.
Toxantron

Kenapa ORDER BY 2?
reggaeguitar

0

masukkan deskripsi gambar di sini

Pertanyaan: EXEC SP_DESCRIBE_FIRST_RESULT_SET N'SELECT ANNUAL_INCOME DARI [BSLID2C]. [DBO]. [EMPLOYEE] '

CATATAN: DALAM BEBERAPA IDE SEBELUM PILIH N ADALAH BEKERJA ATAU, DALAM BEBERAPA IDE TANPA N BEKERJA


0

Tidak ada kunci utama di sini, tetapi ini dapat membantu pengguna lain yang hanya ingin memiliki nama tabel dengan nama bidang dan properti bidang dasar

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

Saya baru saja membuat marc_s "presentasi siap":

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')
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.