2017-02-17 3 views
5

Ich möchte wissen, warum, wenn ich einen benutzerdefinierten Datentyp in SQL Server, basierend auf einem Nicht-Null-Integer erstellen, und ich es einem Standard zuweisen Wert, ich kann diesen Wert nicht erhalten, wenn es keine Tabellendefinition ist (nur eine deklarierte Variable). Hier ist mein Code:SQL Server benutzerdefinierte nicht Null Datentyp mit Standardwert Null

BEGIN TRAN; 
GO 
CREATE TYPE Province FROM INT NOT NULL; 
GO 
CREATE DEFAULT ProvinceDefault AS 4; 
GO 
EXEC sp_bindefault 
'ProvinceDefault', 
'Province'; 
GO 
DECLARE @Province Province; 
SELECT @Province; 
GO 
ROLLBACK TRAN; 

Es gibt NULL

+2

Es ist nur die Art des 'default' Objekts, es gilt nur für Spalten. [MSDN] (https://msdn.microsoft.com/en-us/library/ms173565.aspx) gibt * an "Wenn der Wert an eine Spalte oder einen Alias-Datentyp gebunden ist, gibt er einen Wert an, der in die Spalte eingefügt werden soll an das das Objekt gebunden ist (oder im Falle eines Alias-Datentyps in alle Spalten), wenn während eines Einfügens kein Wert angegeben wird. * ". Es ist nicht möglich, einen Standardwert für eine Variable anzugeben. Es ist auch erwähnenswert, dass "CREATE DEFAULT" veraltet ist, also sollten Sie es wahrscheinlich vermeiden, alles zusammen zu verwenden. – GarethD

Antwort

0

MSDN: -

[@ objname =] 'object_name'

ist der Name der Tabelle und Spalte oder der Alias-Datentyp an die der Standard gebunden werden soll. Objektname ist Nvarchar (776) ohne Standard. objektname kann nicht definiert werden mit dem varchar (max), nvarchar (max), varbinary (max), xml oder CLR user-defined types.

-Link: https://msdn.microsoft.com/en-us/library/ms177503.aspx

+0

Es ist jedoch kein benutzerdefinierter ** CLR ** -Typ, daher scheint dies nicht relevant zu sein. 'sp_bindefault' funktioniert gut für das OP und macht genau das, was es sollte. Das Problem ist, dass das Anwenden eines Standardwerts auf eine Variable nicht zu den Dingen gehört, die es ausführt, und das ist nicht möglich. – GarethD