2016-02-29 26 views
2

我創建了一個樣本Java程序中,我得到的所有對象的定義,就像視圖,觸發器,函數等使用下面的查詢:如何在SQL Server 2008 R2中使用SQL查詢獲取用戶定義的類型定義?

select object_definition(object_id) 
from sys.objects 
where type = 'V'; //for Views 

select object_definition(object_id) 
from sys.objects 
where type = 'TF'; //for Functions 

select object_definition(object_id) 
from sys.objects 
where type = 'TR'; //for triggers 

sys.objects不包含用戶定義的數據類型和用戶定義的表類型。我使用下面的查詢來獲取用戶定義類型: -

select * 
from sys.types 
where is_user_defined = 1; 

是否有使用,我可以得到用戶定義的數據類型和用戶定義的表類型定義的任何SQL查詢?

回答

1

用戶定義的類型本身不會有對象定義 - 它是一個類型而不是對象。

對於用戶定義的表類型,你可以從sys.table_types獲取信息,但在sys.objects你不會從用戶表的object_id得到的這個type_table_object_idobject_definition了比你。你可能想看看這個鏈接,創建表創建腳本:

Generate Create Table Script

爲了您的UDT你必須遵循相似的路徑,寫的東西,查詢的系統表的信息的類型和然後相應地建立一個SQL字符串。你需要運行SQL像(腳本類型創建時,基於服務器的痕跡):

exec sp_executesql N'SELECT 
st.name AS [Name], 
sst.name AS [Schema], 
ISNULL(s1st.name, N'''') AS [Owner], 
CAST(case when st.principal_id is null then 1 else 0 end AS bit) AS  [IsSchemaOwned], 
st.user_type_id AS [ID], 
CAST(CASE WHEN baset.name IN (N''nchar'', N''nvarchar'') AND st.max_length <> -1 THEN st.max_length/2 ELSE st.max_length END AS int) AS [Length], 
CAST(st.precision AS int) AS [NumericPrecision], 
CAST(st.scale AS int) AS [NumericScale], 
CAST(CASE WHEN baset.name IN (N''decimal'', N''int'', N''numeric'', N''smallint'', N''tinyint'', N''bigint'') THEN 1 ELSE 0 END AS bit) AS [AllowIdentity], 
st.max_length AS [MaxLength], 
st.is_nullable AS [Nullable], 
(case when st.default_object_id = 0 then N'''' else def.name end) AS [Default], 
(case when st.default_object_id = 0 then N'''' else schema_name(def.schema_id) end) AS [DefaultSchema], 
(case when st.rule_object_id = 0 then N'''' else rul.name end) AS [Rule], 
(case when st.rule_object_id = 0 then N'''' else schema_name(rul.schema_id) end) AS [RuleSchema], 
ISNULL(st.collation_name, N'''') AS [Collation], 
CAST(CASE WHEN baset.name IN (N''varchar'', N''varbinary'', N''nvarchar'')  THEN 1 ELSE 0 END AS bit) AS [VariableLength], 
baset.name AS [SystemType] 
FROM 
sys.types AS st 
INNER JOIN sys.schemas AS sst ON sst.schema_id = st.schema_id 
LEFT OUTER JOIN sys.database_principals AS s1st ON s1st.principal_id =  ISNULL(st.principal_id, (TYPEPROPERTY(QUOTENAME(SCHEMA_NAME(st.schema_id)) + ''.'' + QUOTENAME(st.name), ''OwnerId''))) 
LEFT OUTER JOIN sys.types AS baset ON (baset.user_type_id = st.system_type_id and baset.user_type_id = baset.system_type_id) or ((baset.system_type_id = st.system_type_id) and (baset.user_type_id = st.user_type_id) and (baset.is_user_defined = 0) and (baset.is_assembly_type = 1)) 
LEFT OUTER JOIN sys.objects AS def ON def.object_id = st.default_object_id 
LEFT OUTER JOIN sys.objects AS rul ON rul.object_id = st.rule_object_id 
WHERE 
(st.schema_id!=4 and st.system_type_id!=240 and st.user_type_id != st.system_type_id and st.is_table_type != 1)and([email protected]_msparam_0 and [email protected]_msparam_1)',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000)',@_msparam_0=N't_your_udt',@_msparam_1=N'your_schema_name' 
+0

不,我不意味着必然要鍵入規則的定義。我的意思是確切的類型定義,如「從datetime創建類型生日null」 – ajain

+0

感謝您的回覆。這不是我需要的確切代碼,但它幫助我爲用戶定義的類型創建自己的腳本。它還不完美,但我正在努力完善它。 – ajain

相關問題