Sql 表中的列的类型不能用作索引中的键列

Sql 表中的列的类型不能用作索引中的键列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个存储员工详细信息的表。我想更改该表,并将列emp\u code中的一列设置为主键。它的数据类型是nvarchar(max),但我无法将其设置为主键 我运行以下查询: ALTER TABLE user_master ADD PRIMARY KEY (emp_code) 但这给了我一个错误: Msg 1919,第16级,状态1,第1行 表user\u master中的列emp\u code的类型不能用作索引中的键列。 Msg 1750,第16级,第0状态,第1行 无法创建约束。请参阅前面的

我有一个存储员工详细信息的表。我想更改该表,并将列
emp\u code
中的一列设置为主键。它的数据类型是
nvarchar(max)
,但我无法将其设置为主键

我运行以下查询:

ALTER TABLE user_master
ADD PRIMARY KEY (emp_code)
但这给了我一个错误:

Msg 1919,第16级,状态1,第1行
user\u master
中的列
emp\u code
的类型不能用作索引中的键列。
Msg 1750,第16级,第0状态,第1行
无法创建约束。请参阅前面的错误


如何克服这个问题?

索引键的总大小不能超过900字节。将数据类型更改为
NVARCHAR(450)
。如果这不合适,请使用代理键(通常是
标识列)。

您不能使用
varchar(max)
。它不是用来存储主键的

找出最长的员工代码,并创建一个覆盖最长案例的大小nvarchar

e、 g.最长员工代码为70个字符,请尝试:-

nvarchar(100)

…只是为了掩饰自己。

是的,你是对的。警告!最大密钥长度为900字节。索引
PK_uu书签\uuu 2DFA2B0E164452B1
的最大长度为2000字节。对于某些大值组合,插入/更新操作将失败。
不使用
varchar(max)

Blob列不能用于索引,它们需要具有固定的大小。它需要是max吗?SQL Server告诉您不能将其作为密钥类型。为什么不把它缩短成有用的内容呢?您的emp_代码列太宽了:对所需大小的猜测;),如果需要全部2GB,该怎么办?@0100011001100001011110010011010这是
NVARCHAR(x)
主键的最大可能大小。太好了!!尺寸是个问题。我将它设置为450(最大值),它工作了。谢谢。非常真实的大小限制是900字节的键。另外:即使从技术上讲,你可以将
NVARCHAR(450)
列作为主键-如果你碰巧也在表上设置了集群键-你的性能会非常差。您所有的非聚集索引都将是巨大且低效的,您的查询将需要读取比实际需要多得多的页面。一个好的集群键应该很窄-见鬼,我甚至说16字节的GUID太多了!不要使用过大和可变长度的集群键<代码>NVARCHAR(100)
可能更好,考虑到它现在是
NVARCHAR
。根据ta的评论进行修改。