添加一世磷_rimary到yy__Column一世s磷r一世米一種r和到和和C○一世你米nIs Primary Key Column到這個查詢
我做了這個查詢,列出表、列、數據類型等:
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_lenght
as 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_length
in 列是該列每行可以佔用sys.columns
的最大*字節數。*對於 , 等固定長度欄位INT
,DATETIME
這些欄位總是佔用最大空間,除非您使用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 頁的數據頁上的指針大小。