Sql-Server

添加一世磷_rimary到yy__Column一世s磷r一世米一種r和到和和C○一世你米nIs Primary Key Column到這個查詢

  • February 5, 2016

我做了這個查詢,列出表、列、數據類型等:

select t.name as 'Table',
      c.name 'Column',
      ty.name 'Data_Type',
      c.max_length as 'Max_Lenght',
      c.is_nullable as 'Null',
      c.is_identity as 'Identity'
from sys.tables t
   join sys.columns c on t.object_id=c.object_id
   join sys.types ty on c.system_type_id=ty.system_type_id
       order by 1 

我有兩個問題:

問題一:

如何'Is primary key?'向其中添加列?我找不到對我有幫助的表格(我看了看sys.indexes, sys.foreign_keys, INFORMATION_SCHEMA.table_constraints)。

問題2:

sys.columns, int 值有max_lenghtas 4,還有一些其他欄位。這是什麼4?每個數據4kb?datetime也是decimal

謝謝。

為每列添加“is_primary_key”欄位的查詢

sys.key_constraints和目錄視圖將sys.index_columns辨識 PK 列。您可以將它們連接在一起,然後將該集合用作派生表以左連接到您的主查詢,這將允許不過濾掉不屬於 PK 的列。

此外,您想使用[user_type_id]而不是[system_type_id]避免笛卡爾積。大多數情況下,這兩個欄位之間不會有區別。但是,如果您有使用者定義的數據類型 (UDDT),或者使用sysname數據類型(它是 的別名NVARCHAR(128)),那麼該[system_type_id]值將在sys.types目錄視圖中重複。

以下查詢列出了所有表中的所有欄位,添加了一個計算欄位來表示該列是否是 PK 的一部分。它也處理複合 PK。

SELECT tbl.[name] AS [TableName],
      col.[name] AS [ColumnName],
      ty.[name] AS [DataType],
      col.[max_length] AS [MaxLength],
      col.[is_nullable] AS [Nullable],
      col.[is_identity] AS [Identity],
      CONVERT(BIT, IIF(pkcol.index_id IS NOT NULL, 1, 0)) AS [PrimaryKey]
FROM       sys.tables tbl
INNER JOIN sys.columns col
       ON col.[object_id] = tbl.[object_id]
INNER JOIN sys.types ty
       ON ty.[user_type_id] = col.[user_type_id] -- do not use system_type_id
LEFT JOIN (
          SELECT ind.[object_id] AS [table_object_id], ind.[index_id], ind.[column_id]
          FROM   sys.index_columns ind
          INNER JOIN sys.key_constraints pks
                  ON pks.[parent_object_id] = ind.[object_id]
                 AND pks.[unique_index_id] = ind.[index_id]
          WHERE  pks.[type] = 'PK'
         ) pkcol
      ON pkcol.[table_object_id] = tbl.[object_id]
     AND pkcol.[column_id] = col.[column_id]
ORDER BY tbl.[name], col.[name];

max_length欄目資訊

max_lengthin 列是該列每行可以佔用sys.columns的最大*字節數。*對於 , 等固定長度欄位INTDATETIME這些欄位總是佔用最大空間,除非您使用SPARSE選項(每列設置)或啟用數據壓縮(每索引設置)。

對於可變長度欄位,例如VARCHAR, NVARCHAR,XML等,該值是它可以佔用的最大字節數。的值表示由( 、和) 和類型使用-1的大約 2 GB ( Int32.MaxValue)的值。MAX``VARCHAR``NVARCHAR``VARBINARY``XML

未聲明為的 Unicode 字元串類型 (NCHAR和)將顯示 a of ,因為(安全的)假設是它們每個“字元”使用 2 個字節。情況並非總是如此,因為補充字元實際上是每個“字元”4 個字節。但是,這就是為什麼,作為 的別名,a為 256。類似地,允許在 8 位/欄位中映射超過 256 個字元的不太常用的雙字節字元集 (DBCS) 排序規則將儲存字元1 或 2 個字節,具體取決於字元。含義,對於使用 DBCS 排序規則的數據,對於數據,將列或變數聲明為或NVARCHAR``MAX``max_length``2 * declared_max``sysname``NVARCHAR(128)``max_length``VARCHAR``CHAR``VARCHAR``NVARCHAR``VARCHAR(x)``NVARCHAR(x)不保證x 個字元是可儲存的:如果所有這些字元都是該類型的標準長度(即 1 個字節, 2 個字節),您只能容納x 個字元。因此,一個欄位最多可以使用 6 個字節。這可以適合:3 個正常的 2 字節 Unicode 字元,或 1 個正常的 2 字節字元和 1 個 4 字節的補充字元(只有 2 個字元,而不是 3 個)。它不能容納 2 個補充字元,因為這需要 8 個字節。VARCHAR``NVARCHAR``NVARCHAR(3)

已棄用的TEXT, NTEXT, 和IMAGE沒有人再使用的類型(這是諷刺)顯示max_length為 16,大概是指向保存數據的 LOB 頁的數據頁上的指針大小。

引用自:https://dba.stackexchange.com/questions/128314