[英]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.types
的is_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.