2015-05-18 14 views
6

Voglio creare una tabella denominata tbl_Ticket_Mail_Address. Durante la creazione di tabella che mostra errore.È di un tipo non valido per l'uso come colonna chiave in un indice?

Tabella:

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 Data Provider: Messaggio 1919, livello 16, stato 1, riga 1 Colonna 'emp_id' nella tabella 'tbl_Ticket_Mail_Address' è di un tipo che non è valido per l'uso come colonna chiave in un indice. (86): SQL72045: errore di esecuzione dello script. Lo script eseguito:

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 Data Provider: Messaggio 1750, livello 16, stato 0, riga 1 Impossibile creare il vincolo o di un indice. Vedi errori precedenti. (86): SQL72045: errore di esecuzione dello script. Lo script eseguito: Si è verificato un errore durante l'esecuzione del batch.

+4

Desiderate davvero che le persone inserissero le opere complete di shakespeare in es. 'Mobile'? Scegli * ragionevole * lunghezza dei dati per le tue colonne piuttosto che solo 'nvarchar (max)' su tutta la linea e, assumendo che 'Emp_ID' riduca a una dimensione ragionevole, il problema dovrebbe scomparire. –

+0

@Damien_The_Unbeliever: Grazie.... – Reshma

+0

Le colonne ID sono in genere numeriche. Perché usi nvarchar per 'Emp_ID'? –

risposta

11

SQL Server non consente di creare un indice Univoco utilizzando una colonna nvarchar(max). Come D_T_U ha commentato, scegli una dimensione più piccola, ad es. nvarchar(100) e sarai in grado di creare l'indice.

Ovviamente, la dimensione della colonna deve adattarsi alle proprie esigenze, quindi 100 è solo un esempio.

Informazioni sul bonus: quando si crea l'indice, tenere presente che la dimensione dei valori dell'indice combinato non deve superare i 900 byte. Ogni carattere nvarchar utilizzerà 2 byte, quindi al massimo è possibile avere una dimensione combinata di nvarchar(450). Ad esempio, nel tuo caso si potrebbe avere

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

E 'consentito, ma pericoloso, a dichiarare più grandi formati per le colonne nvarchar fino a quando i dati su qualsiasi data riga non superi 900 byte. Ad esempio, se si dichiarano entrambe le colonne come nvarchar(300), verrà visualizzato il seguente messaggio:

Avviso! La lunghezza massima della chiave è di 900 byte. L'indice 'uc_tbl_Ticket_Mail_Address' ha una lunghezza massima di 1200 byte. Per una combinazione di valori grandi, l'operazione di inserimento/aggiornamento fallirà .

+0

Voto superiore per la lunghezza massima di 450 – Jacob

1

Verificare l'istruzione CREATE INDEX in MSDN.

colonne che sono di grandi dimensioni dell'oggetto (LOB) tipi di dati ntext, text, varchar (max), nvarchar (max), varbinary (max), XML, o immagine può non essere specificate come colonne chiave per un indice

Per risolvere il problema, fare riferimento al commento di @ Damien_The_Unbeliever.

Problemi correlati