【问题标题】:Error while creating unique clustered index in view in SQL Server在 SQL Server 的视图中创建唯一聚集索引时出错
【发布时间】:2018-01-11 08:56:51
【问题描述】:

我想在视图中按名称创建唯一的聚集索引。

这就是我创建视图的方式

create view vWTotalsalesbyProduct
with schemabinding
as
    select 
        Name,
        Sum(Isnull(Unitprice * QuantitySold, 0)) as TotalSales,
        COUNT_BIG(*) as Totaltransation 
    from 
        dbo.product P 
    join
        dbo.tblproductcount C on P.productID = C.productID 
    group by 
        Name

这就是我创建唯一聚集索引的方式

create unique clustered index UIX_vWTotalsalesbyProductName 
on vWTotalsalesbyProduct(Name)

但我得到一个错误

表 'vWTotalsalesbyProduct' 中的列 'Name' 的类型不能用作索引中的键列。

帮我解决

【问题讨论】:

  • 那么基表中Name列的数据类型是什么?
  • 你能把它改成更健全的数据类型吗?我无法想象一个名字需要支持 2GB 的长度
  • 您不能使用 varchar(max) 作为索引中的键列
  • 解决方案是将您的密钥声明为 nvarchar(20)
  • 你最好使用productID字段作为聚集索引。

标签: sql-server view unique clustered-index


【解决方案1】:

唯一约束每行最多可容纳 8000 个字节。因此,如果列的最大长度允许存储超过 8000 字节,则会出现错误。

CREATE TABLE dbo.Temp
(
    Name VARCHAR(901) UNIQUE
)

这段代码给了我以下警告

警告!最大密钥长度为 900 字节。索引“UQ__Temp__737584F64FD1D5C8”的最大长度为 5000 字节。对于某些较大值的组合,插入/更新操作将失败。

虽然这很好用

create TABLE dbo.Temp
(
    Name VARCHAR(900) UNIQUE
)

如果你使用 VARCHAR(MAX) 或 NVARCHAR(MAX) 你会得到这个确切的错误

create TABLE dbo.Temp
(
    Name VARCHAR(max) UNIQUE
)

因此请确保Name 列的最大允许大小小于900 字节

【讨论】:

  • 错误是关于数据类型,而不是大小。 (n)varchar(max) 是不同的数据类型,不同的存储
  • @Panagiotis Kanavos 这就是为什么他得到的只是警告而不是错误
  • @marc_s in the question 错误为is of a type that is invalid for use as a key column in an index.,类型为varchar(max)
  • @DenisRubashkin 我们是在阅读不同的问题,还是将问题编辑为完全不同的内容? Column 'Name' in table 'vWTotalsalesbyProduct' is of a type that is invalid for use as a key column in an index
  • @marc_s varchar(max)blob 类型。它存储在页面外部。该表仅包含指向实际数据位置的指针。当我们使用 text/ntext 时,出于同样的原因,同样的限制也适用。
猜你喜欢
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2010-10-23
相关资源
最近更新 更多