2017-06-12 125 views
7

最近我已閱讀關於UDT。我創建了一個類型,但是我遇到了一個問題。請看以下而不是拋出錯誤類型塊成功執行

---drop type ssn 
CREATE TYPE ssn 
FROM VARCHAR(11) NOT NULL; 

DECLARE @er ssn; 

IF Object_id('TEMPDB.DBO.#ter', 'U') IS NOT NULL 
    DROP TABLE #ter; 

CREATE TABLE #ter (
    PERIOD_SID INT 
    ,PERIOD_QUAR VARCHAR(10) PRIMARY KEY (PERIOD_SID) 
    ) 

INSERT INTO #ter (
    PERIOD_SID 
    ,PERIOD_QUAR 
    ) 
SELECT * 
FROM (
    VALUES (
     (1) 
     ,(@er) 
     ) 
    ) V(p, q) 

我創建VARCHAR(11)爲ssn一種不爲空,跑到上面的一個邏輯,它成功地執行 enter image description here

按我的設想,應該拋出錯誤。

我需要知道爲什麼上述邏輯成功運行。

編輯

按照建議,我已經加入此UDT在AQL服務器列,因爲在Oracle中,我們可以創建類似收藏一列UDT

IF Object_id('TEMPDB.DBO.#ter1', 'U') IS NOT NULL 
    DROP TABLE #ter1; 

CREATE TABLE #ter1 (
    PERIOD_SID INT 
    ,PERIOD_QUAR ssn PRIMARY KEY (PERIOD_SID) 
    ) 

enter image description here

創建表時遇到錯誤,表示沒有此類數據類型「ssn」

預先感謝

+0

你期望得到哪個錯誤? –

+0

@GiorgosBetsos我希望像空值不能分配給變量 – Smart003

+1

在SQL Server中,我們可以'聲明'變量'*初始化*它(默認爲'NULL')。所以它會使'UDT'的NOT NULL屬性無效。不知道爲什麼它允許在UDT中提及NOT NULL屬性。 –

回答

1

這裏是reason

的null_type參數只定義的默認爲空此 數據類型。如果在創建表格時使用別名數據 類型時明確定義了可空性,則優先於定義的可空性的 。

這取自sp_addtype,但它應該與CREATE TYPE相同。 sp_addtype也用於創建用戶定義的數據類型

在您的情況下,我們無法創建一個不接受NOT NULL值的變量。所以我認爲該屬性被覆蓋