SQL Server:创建表变量,主键约束定义错误

问题描述

| 我正在尝试使用主键创建一个表变量。这两个语句有什么区别?为什么第一个不起作用?
--This does not work
declare @tabvar table (
    rowid int identity(1,1) not null,var1 int null,constraint PK_tabvar_rowid primary key clustered (rowid)
)

--This works
declare @tabvar1 table (
    rowid int identity(1,1) not null primary key clustered,var1 int null
)
    

解决方法

        看起来这种行为已在BOL中得到了很好的记录。查看DECLARE TABLE变量vs CREATE TABLE的语法定义。     ,        当您创建如下表时:
CREATE TABLE tabvar (
rowid int identity(1,1) not null,var1 int null,constraint PK_tabvar_rowid primary key clustered (rowid))
您创建了一个单独的SQL对象PK_tabvar_rowid。 如上所述,此方法对于永久表是首选的,因为您专门命名了约束并且它独立于表对象而存在。 您可以使用以下形式:
 CREATE TABLE tabvar (
rowid int identity(1,1) not null primary key,var1 int null)
但这会创建一个随机命名的约束,这会使将来的管理更加困难。 对于表变量(瞬态)-您不能有独立的约束-因此您必须使用内联主键定义。     ,        创建表变量时使用的CREATE TABLE(Transact-SQL)和DECLARE @local_variable(Transact-SQL)的语法有所不同。您不能使用第一条语句的语法来创建变量表。     ,        您使用的语法是
CREATE TABLE
,而不是表变量。
CREATE TABLE tabvar (
    rowid int identity(1,constraint PK_tabvar_rowid primary key clustered (rowid)
)
上面的工作正常,如预期的那样。但是,如果您查看声明表变量的语法,则会看到可以做什么和不能做什么:
declare @tabvar table (
    rowid int identity(1,primary key (rowid)
)