I\'m trying to create a table variable with primary key. What is the difference between these two statements? Why the first one does not work?
--This does not wo
Looks like this behavior is well documented in BOL. Look at the syntax definitions for DECLARE TABLE Variable vs CREATE TABLE.
There are differences in the syntax between the CREATE TABLE (Transact-SQL) and DECLARE @local_variable (Transact-SQL) used in creating table variables. You can not use the syntax of the first statement to create a variable table.
When you create a table like:
CREATE TABLE tabvar (
rowid int identity(1, 1) not null,
var1 int null
, constraint PK_tabvar_rowid primary key clustered (rowid))
you create a separate SQL object called PK_tabvar_rowid.
This method is preferred for permanent tables as above, because you specifically name the constraint and it exists independently from the table object.
You CAN use the form:
CREATE TABLE tabvar (
rowid int identity(1, 1) not null primary key,
var1 int null)
but this creates a randomly named constraint, which makes future management more difficult.
For table variables (which are transient) - you CANNOT have an independent constraint - so you MUST use the inline primary key definition.
The syntax you're using is for CREATE TABLE, not table variables.
CREATE TABLE tabvar (
rowid int identity(1, 1) not null,
var1 int null
, constraint PK_tabvar_rowid primary key clustered (rowid)
)
The above works fine, as expected. However if you look at the syntax for declaring table variables you'll see what you can and can't do:
declare @tabvar table (
rowid int identity(1, 1) not null,
var1 int null,
primary key (rowid)
)