簡體   English   中英

如何判斷列是否屬於 sysname 類型

[英]How to tell whether a column is of sysname type

如何通過查詢系統列來查找表中的列是一個常見問題。 例如SQL 服務器查詢以獲取表中的列列表以及數據類型,NOT NULL 和 PRIMARY KEY 約束提供了在大多數情況下都有效的查詢。 但是,類型為sysname的列作為普通nvarchar返回。 在 Management Studio (SSMS) 中編寫表定義腳本將正確地給出sysname類型。 sp_columns 但是,如何使用針對系統表的 SQL 查詢來查找列是否屬於sysname類型? (我不想為每個表單獨運行sp_columns 。)

如果您想知道從什么sysname類型開始, SQL Server 中的 SYSNAME 數據類型是什么? 提供一些信息。

提供更多細節:

create view some_table_names as select name from sys.tables

然后運行

sp_columns 'some_table_names'

報告type_name=sysname 但是對 sys.columns 的簡單查詢只給出varchar

select type_name(c.system_type_id)
from sys.objects t
join sys.columns c
  on t.object_id = c.object_id
where t.name = 'some_table_names'

我查看了sp_columns的定義,看看我是否可以做同樣的事情。 它在系統表sys.spt_columns_odbc_view中查找列詳細信息。 但這顯然是一些絕密內部表,只能從直接管理員連接 (DAC) 或 SSMS 中查詢。 (請參閱什么是 spt_columns_odbc_view 以及為什么它無法訪問? )即使我沒有從 Management Studio 或通過 DAC 運行sp_columns proc,它也會設法查詢此視圖。 但我不知道如何在我自己的代碼中重復這個技巧。

是否有其他方法可以判斷列是否為sysname類型?

首先,沒有將數據存儲為sysname的有效案例,即使對於維護腳本也是如此。 對於腳本,您需要表或列的實際名稱,因此將其存儲在nvarchar(128)字段中非常好。

系統本身將sysname視為sys.types表中的用戶類型。 如果您檢查記錄,您會看到數據庫本身告訴您這是一個nvarchar 如果要返回該別名,請使用types.user_type_id加入sys.columns.user_type_id列,例如:

select object_name(object_id), 
types.name,
* 
from sys.columns
inner join sys.types on types.user_type_id =sys.columns.user_type_id
where columns.user_type_id=256

要不就

select object_name(object_id), 
TYPE_NAME(user_type_id),
* 
from sys.columns
where user_type_id=256

更新

我剛剛檢查了服務器上的類型記錄,在該服務器上我使用不同的排序規則進行數據庫化,並注意到排序規則更改為與數據庫匹配。 因此,即使在同一台服務器上,使用該別名也會導致排序問題

sys.types目錄視圖公開了可以在 DDL 中指定的數據類型。 您可以在user_type_id上加入此視圖以識別列類型。 從這個查詢中可以看出, sysname不是內部機密類型。

SELECT c.Name AS ColumnName, ty.name AS TypeName, c.max_length AS ColumnLengthBytes
FROM sys.objects t
JOIN sys.columns c ON t.object_id = c.object_id 
JOIN sys.types ty ON c.user_type_id = ty.user_type_id
WHERE t.name = N'test_table';

sysname類似於用戶定義的類型。 它與使用CREATE TYPE創建的 UDT 不同之處在於sys.typesis_user_defined列將為零而不是一,因為它是由 SQL 服務器而不是用戶定義的。

還可以加入system_type_id以同時返回用戶和基本系統類型。

SELECT c.Name AS ColumnName, ty.name AS TypeName, c.max_length AS ColumnLengthBytes
FROM sys.objects t
JOIN sys.columns c ON t.object_id = c.object_id 
JOIN sys.types ty ON ty.system_type_id = c.system_type_id
WHERE t.name = N'test_table';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM