我正在尝试使用主键创建表变量。这两个陈述有什么区别?为什么第一个不起作用?
--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
)
答案 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)
)