如何设置和索引两列T-SQL声明的表变量?

ela*_*row 5 t-sql sql-server sql-server-2008

使用SQL Server 2008 R2

考虑一个声明的变量,如:

DECLARE @t TABLE (PK int IDENTITY(1,1) PRIMARY KEY CLUSTERED, Col1 int, Col2 int)
Run Code Online (Sandbox Code Playgroud)

我怎么做CREATE NONCLUSTERED INDEX任何名字,ON @t包括(Con1 ASC, Col2 ASC)

索引不应限于唯一值.

出于某种原因,我无法弄清楚这一点......

Mar*_*ith 7

可以按如下方式创建非聚集索引.

DECLARE @t TABLE (
  PK   INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
  Col1 INT,
  Col2 INT,
  UNIQUE (Col1, Col2, PK)) 
Run Code Online (Sandbox Code Playgroud)

如果意图是Col1, Col2唯一的,那么PK从列列表中删除.

尽管它在面值中看起来好像在(PK)中添加了一个额外的列,但索引结构与Col1, Col2#temp表上创建非唯一索引相同.

CREATE TABLE #T  (
  PK   INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
  Col1 INT,
  Col2 INT) 

/*PK added in to end of key anyway*/  
CREATE NONCLUSTERED INDEX ix ON #T(Col1, Col2)
Run Code Online (Sandbox Code Playgroud)

对于非唯一的非聚集索引,SQL Server始终隐式地将CI密钥添加到NCI密钥.这只是明确地显示它.

有关非聚集索引键的更多信息,请参阅Kalen Delaney


Dam*_*ver 5

你不能.declare(<table_type_definition>):

定义表数据类型.表声明包括列定义,名称,数据类型和约束.允许的唯一约束类型是PRIMARY KEY,UNIQUE,NULL和CHECK.

注意,没有提到索引.

如果需要索引,请创建临时表(CREATE TABLE #t (...).