是否为无法用作索引中的键列的类型?

时间:2015-05-18 08:43:48

标签: sql-server

我想创建一个名为tbl_Ticket_Mail_Address的表。创建表时显示错误。

表:

CREATE TABLE [dbo].[tbl_Ticket_Mail_Address] (
    [Id]           INT            IDENTITY (1, 1) NOT NULL,
    [Designation]  NVARCHAR (MAX) NULL,
    [Emp_ID]       NVARCHAR (MAX) NOT NULL,
    [Emp_Name]     NVARCHAR (MAX) NULL,
    [Mobile]       NVARCHAR (MAX) NULL,
    [Emp_Email]    NVARCHAR (MAX) NULL,
    [Category]     NVARCHAR (MAX) NULL,
    [Created_By]   NVARCHAR (MAX) NULL,
    [Created_Date] DATE           NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [uc_tbl_Ticket_Mail_Address] UNIQUE NONCLUSTERED ([Emp_ID] ASC, [Category] ASC)
);
  

58,1):SQL72014:.Net SqlClient数据提供程序:消息1919,级别16,状态1,行1列'tbl_Ticket_Mail_Address'中的列'Emp_ID'属于无效用作关键列的类型一个索引。       (57,5):SQL72045:脚本执行错误。执行的脚本:

CREATE TABLE [dbo].[tbl_Ticket_Mail_Address] (
    [Id]           INT            IDENTITY (1, 1) NOT NULL,
    [Designation]  NVARCHAR (MAX) NULL,
    [Emp_ID]       NVARCHAR (MAX) NOT NULL,
    [Emp_Name]     NVARCHAR (MAX) NULL,
    [Mobile]       NVARCHAR (MAX) NULL,
    [Emp_Email]    NVARCHAR (MAX) NULL,
    [Category]     NVARCHAR (MAX) NULL,
    [Created_By]   NVARCHAR (MAX) NULL,
    [Created_Date] DATE           NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [uc_tbl_Ticket_Mail_Address] UNIQUE NONCLUSTERED ([Emp_ID] ASC, [Category] ASC)
);
  

(58,1):SQL72014:.Net SqlClient数据提供程序:消息1750,级别16,状态0,行1无法创建约束或索引。查看以前的错误。       (57,5):SQL72045:脚本执行错误。执行的脚本:   批处理执行时发生错误。

3 个答案:

答案 0 :(得分:16)

SQL Server不允许您使用nvarchar(max)列创建唯一索引。如D_T_U所述,请选择较小的尺寸,例如: nvarchar(100)您将能够创建索引。

当然,列大小需要符合您的要求,因此100只是一个例子。

奖励信息:创建索引时,请记住组合索引值的大小不得超过900个字节。每个nvarchar字符将使用2个字节,因此您最多可以使用nvarchar(450)的组合大小。例如,在您的情况下,您可以

[Emp_ID] NVARCHAR (50) NOT NULL,
[Category] NVARCHAR (400) 

只要任何给定行上的数据不超过900字节,就可以为nvarchar列声明更大的大小,但这是危险的。例如,如果您将两列都声明为nvarchar(300),则会收到以下消息:

  

警告!最大密钥长度为900字节。该指数   'uc_tbl_Ticket_Mail_Address'的最大长度为1200字节。对于   某些大值组合,插入/更新操作会   失败。

答案 1 :(得分:1)

检查MSDN中的CREATE INDEX语句。

  

大对象(LOB)数据类型ntext,text,   varchar(max),nvarchar(max),varbinary(max),xml或image不能   指定为索引的键列。

要解决问题本身,请参阅@ Damien_The_Unbeliever的评论。

答案 2 :(得分:0)

如果您的索引列已定义为SPARSE,也会发生此错误。

[hash] VARBINARY(32) SPARSE NULL -- Fail
[hash] VARBINARY(32) NULL        -- Success
  

(597,1):SQL72014:.Net SqlClient数据提供程序:消息1919,级别16,   表'Document_JSON'中的状态2,行1列'hash'是类型   不能用作索引中的键列。

     

(597,0):SQL72045:脚本执行错误。