2017-06-12 52 views
7

Ostatnio czytałem o UDT. Stworzyłem typ, ale mam z tym problem. Proszę spojrzeć na następująceZamiast rzucania bloku typu błędu wykonanego pomyślnie

---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) 

mam utworzyć typ SSN z varchar (11) NOT NULL, a prowadził nad jedną logikę, to wykonać pomyślnie enter image description here

Jak na moje założenia powinien rzucać błąd.

Muszę wiedzieć, dlaczego powyższa logika działa poprawnie.

EDIT

zgodnie z sugestią dodałem ten UDT jako kolumny w serwerze AQL, ponieważ w Oracle możemy utworzyć kolumnę z kolekcji podobnej do 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

Wystąpił błąd podczas tworzenia tabeli z informacją, że nie było takiego typu danych "ssn"

góry dzięki

+0

Jakiego błędu oczekiwałeś? –

+0

@GiorgosBetsos Chciałbym się spodziewać, że wartości pustej nie można przypisać do zmiennej er – Smart003

+1

W SQL Server możemy "zadeklarować" zmienną 'z * inicjalizacją * it (domyślnie" NULL "). Więc unieważnia właściwość 'NOT NULL' z' UDT'. Nie wiem, dlaczego zezwolono na wymienienie właściwości NOT NULL w UDT. –

Odpowiedz

1

Oto parametr reason

null_type definiuje jedynie domyślne opcje dopuszczania wartości null dla tego typu danych. Jeśli właściwość null jest zdefiniowana jawnie, gdy używany jest typ aliasu o numerze podczas tworzenia tabeli, ma on pierwszeństwo przed zdefiniowaną zerowością.

Jest to wzięte z sp_addtype, ale powinno być to ten sam przypadek z CREATE TYPE. sp_addtype służy również do utworzenia typu danych zdefiniowanego przez użytkownika

W twoim przypadku nie możemy utworzyć zmiennej, która nie będzie akceptować wartości NOT NULL. Więc myślę, że właściwość została nadpisana