2013-10-28 54 views
4

我的SQL Server 2008 R2/2012上創建用戶定義的表類型與此聲明:的SQL Server創建的模式用戶自定義表類型不能正常工作

CREATE TYPE [MySchemaName].[MyUserTableType] 
    As Table ([Id] varchar(20) NOT NULL); 

這按預期工作。

我還得到一個存儲過程,它將所有關聯的對象刪除到給定的模式。 這是我的用戶定義表類型無法正常工作的地方。我期待 這些類型是用相關的模式創建的。

如果我嘗試刪除架構,它會抱怨該架構與我的用戶定義表類型相關聯。因此它不會被刪除。

但是,如果我查詢我的數據庫中的所有對象是TYPE_TABLE它告訴我,我的表類型不屬於我的架構。他們屬於模式'系統'

SELECT name, schema_id, type_desc 
FROM [TESTDB].SYS.OBJECTS 
WHERE type_desc = 'TYPE_TABLE'; 

SELECT * FROM sys.schemas; 

任何想法爲什麼?

這裏是我的輸出 enter image description here

+0

這是我的理解是用戶定義類型總是被分配到「SYS」的模式,所以這是預期的行爲有關在一起。用戶定義的模式可以分配給函數,過程,表格和觸發器 – talegna

回答

5

而不是尋找在sys.objects這些截圖,你應該看看在sys.typessys.table_types(其中還公開type_table_object_id)。

SELECT name, 
     schema_id /*Will be the "test" schema id*/ 
FROM sys.types 
WHERE is_table_type = 1 
     AND name = 'MyUserTableType' 

當你創建定義類型的用戶增加了一個行sys.sysscalartypes與用戶提供的模式和名稱和Row sys.sysschobjs與在sys架構的系統生成的名稱。系統生成的名稱是通過連接TT_ + FriendlyName + _ +對象ID的十六進制版本創建的。

這兩個實體之間通過sys.syssingleobjrefs

/*This query only works via the DAC*/ 
SELECT so.id AS object_id, 
     st.id AS user_type_id, 
     * 
FROM sys.sysschobjs so 
     JOIN sys.syssingleobjrefs sor 
     ON sor.indepid = so.id 
     JOIN sys.sysscalartypes st 
     ON st.id = sor.depid 
WHERE st.name = 'MyUserTableType' 
相關問題