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

时间:2011-06-18 11:25:32

标签: sql-server sql-server-2008 indexing

我正在尝试使用主键创建表变量。这两个陈述有什么区别?为什么第一个不起作用?

--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
)

4 个答案:

答案 0 :(得分:2)

创建表格时:

CREATE TABLE tabvar (
rowid int identity(1, 1) not null,
var1 int null
   , constraint PK_tabvar_rowid primary key clustered (rowid))

您创建一个名为PK_tabvar_rowid的单独SQL对象。

此方法对于上面的永久表是首选,因为您专门命名约束,它独立于表对象存在。

您可以使用以下表格:

 CREATE TABLE tabvar (
rowid int identity(1, 1) not null primary key,
var1 int null)

但这会创建一个随机命名的约束,这会使未来的管理变得更加困难。

对于表变量(它是瞬态的) - 你不能有一个独立的约束 - 所以你必须使用内联主键定义。

答案 1 :(得分:1)

创建表变量时使用的CREATE TABLE (Transact-SQL)DECLARE @local_variable (Transact-SQL)之间的语法有所不同。您不能使用第一个语句的语法来创建变量表。

答案 2 :(得分:1)

BOL 中可以很好地记录此行为。查看DECLARE TABLE Variable vs CREATE TABLE的语法定义。

答案 3 :(得分:-1)

您使用的语法是CREATE TABLE,而不是表变量。

CREATE TABLE tabvar (
    rowid int identity(1, 1) not null,
    var1 int null
       , constraint PK_tabvar_rowid primary key clustered (rowid)
)

如上所述,上述工作正常。但是,如果你查看declaring table variables的语法,你会看到你能做什么和不能做什么:

declare @tabvar table (
    rowid int identity(1, 1) not null,
    var1 int null,
       primary key (rowid)
)