• Paul White NZ (3/30/2010)


    It seems odd to me that type names must be lower cased in a case-sensitive database.

    It's not true (or I don't understand what you mean). The names of system data types (except 'sysname') may be written in whatever case you want. The names of user data types (plus 'sysname') must be written in the same case as they are defined in the database.

    DECLARE @1 Int, @2 int, @3 INT -- works fine in a case-sensitive DB

    GO

    CREATE TYPE MyAwesomeType FROM VARCHAR(30)

    GO

    DECLARE @1 MyAwesomeType -- works fine

    GO

    DECLARE @1 myAwesomeType -- fails in a case-sensitive DB

    GO

    DROP TYPE MyAwesomeType

    SQL Server considers 'sysname' as a user data type and a system data type at the same time. Here is a script which confirms it:

    SELECT name, system_type_id, user_type_id, is_user_defined

    FROM sys.types

    WHERE name = 'sysname'

    -- name system_type_id user_type_id is_user_defined

    -- ---------- -------------- ------------ ---------------

    -- sysname 231 256 0

    And here is a quote from BOL (http://msdn.microsoft.com/en-us/library/ms188021.aspx):

    For system data types, user_type_id = system_type_id

    ...

    is_user_defined

    1 = User-defined type.

    0 = SQL Server system data type.

    Sysname has system_type_id = 231, which means 'nvarchar'. Looks like sysname is created by the statement 'CREATE TYPE sysname FROM nvarchar(128)'.

    Paul White NZ (3/30/2010)


    Am I the only one that prefers to upper case my types?

    It depends on what you call 'my types' 🙂 For 'standard data types in my code', I prefer upper case (INT, VARCHAR, SYSNAME etc.). For 'data types defined by me' (which is equivalent to 'CLR data types' in my case), I prefer Pascal case (ParameterSet, VarArray etc.).