2015-05-18 22 views
6

Tôi muốn tạo một bảng có tên là tbl_Ticket_Mail_Address. Trong khi tạo bảng hiển thị lỗi.Là loại không hợp lệ để sử dụng làm cột khóa trong chỉ mục?

Bảng:

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: Provider Net SqlClient dữ liệu: Msg 1919, Level 16, State 1, Line 1 Cột 'Emp_ID' trong bảng 'tbl_Ticket_Mail_Address' là một loại không hợp lệ để sử dụng làm cột khóa trong chỉ mục. (58,0): SQL72045: Lỗi thực thi tập lệnh. Kịch bản thực hiện:

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: Provider Net SqlClient dữ liệu: Msg 1750, Level 16, State 0, Line 1 Không thể tạo ra hạn chế hoặc chỉ số. Xem các lỗi trước đó. (58,0): SQL72045: Lỗi thực thi tập lệnh. Tập lệnh được thực thi: Đã xảy ra lỗi trong khi lô đang được thực hiện.

+4

Bạn có thực sự muốn mọi người chèn các tác phẩm hoàn chỉnh của shakespeare vào ví dụ: 'Điện thoại di động'? Chọn * độ dài dữ liệu * hợp lý cho các cột của bạn thay vì chỉ 'nvarchar (max)' trên bảng và, giả sử 'Emp_ID' đi xuống đến một kích thước hợp lý, vấn đề sẽ biến mất. –

+0

@Damien_The_Unbeliever: Cảm ơn bạn.... – Reshma

+0

Các cột ID thường là số. Tại sao bạn sử dụng nvarchar cho 'Emp_ID'? –

Trả lời

11

Máy chủ SQL không cho phép bạn tạo chỉ mục duy nhất sử dụng cột nvarchar(max). Như D_T_U đã nhận xét, hãy chọn kích thước nhỏ hơn, ví dụ: nvarchar(100) và bạn sẽ có thể tạo chỉ mục.

Đương nhiên, kích thước cột cần phải phù hợp với yêu cầu của bạn, vì vậy 100 chỉ là một ví dụ.

Thông tin tiền thưởng: Khi tạo chỉ mục, hãy nhớ rằng kích thước của giá trị chỉ mục kết hợp không được vượt quá 900 byte. Mỗi ký tự nvarchar sẽ sử dụng 2 byte, vì vậy, bạn có thể tối đa một kích thước được kết hợp là nvarchar(450). Ví dụ, trong trường hợp của bạn, bạn có thể có

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

Đó là chấp nhận được, nhưng nguy hiểm, để khai báo kích thước lớn hơn đối với các cột nvarchar miễn là các dữ liệu trên bất kỳ hàng cho không vượt quá 900 byte. Ví dụ: nếu bạn khai báo cả hai cột là nvarchar(300), bạn sẽ nhận được thông báo sau:

Cảnh báo! Độ dài khóa tối đa là 900 byte. Chỉ số 'uc_tbl_Ticket_Mail_Address' có độ dài tối đa là 1200 byte. Đối với một số kết hợp các giá trị lớn, thao tác chèn/cập nhật sẽ không thành công.

+0

Upvote cho độ dài tối đa 450 – Jacob

1

Kiểm tra tuyên bố CREATE INDEX trong MSDN.

Cột được của đối tượng lớn (LOB) kiểu dữ liệu ntext, văn bản, varchar (max), nvarchar (max), varbinary (max), xml, hoặc hình ảnh không thể quy định như cột quan trọng cho một chỉ số.

Để tự khắc phục sự cố, hãy tham khảo nhận xét của @ Damien_The_Unbeliever.

Các vấn đề liên quan