• I won't comment on cursors, as I see no point in thinking about them.

    Table however is clearly not a datatype; associated with any datatype is the somain for that datatype, and an object that has that datatype can take any value from that domain. So if I have two declarations

    declare @a table(x int primary key, y varchar(32) not null, z decimal(15,3) check (z>=0));

    declare @b-2 table(x nvarchar(4) not null, y nvarchar(4) not null, z int check (z<0), primary key(y,x), unique(z,y));

    the variable @a can take one set of values and the variable @b-2 can take a different set of values; most values of @a could never by values of @b-2, and vice versa. That makes it absolutely clear that @a and @b-2 have two different types. It's not Table which is a tpe, but an expression like table(x int primary key, y varchar(32) not null, z decimal(15,3) check (z>=0)).

    Tom