Je transfère un script db d'un système 64 bits vers un système 32 bits. Lorsque j'exécute le script, cela me donne l'erreur suivante,
Avertissement! La longueur de clé maximale est de 900 octets. L'index "UQ__Users__7E800015145C0A3F" a une longueur maximale de 1000 octets. Pour une combinaison de grandes valeurs, l'opération d'insertion/mise à jour échouera.
Les résultats de Google et les questions de débordement de pile n'ont pas aidé à résoudre ce problème.
Pour l'indexation de colonnes de grande taille, sqlserver indexe uniquement les colonnes dont la taille peut atteindre 900 octets.
Pour résoudre ce problème
Tout d'abord: j'ai ajouté une colonne hashCol pour générer un code de hachage de type SHA1 pour MyCol
alter table myTable
add
hashCol AS HASHBYTES('SHA1', CONVERT(VARCHAR(90), MyCol))
Deuxièmement: j'ai ajouté une contrainte unique pour hashCol pour identifier de manière unique MyCol
ALTER TABLE myTable
ADD CONSTRAINT hashCol_Unique UNIQUE (hashCol)
De cette façon, j'ai surmonté le problème des colonnes d'indexation qui ont une grande taille
les références
Générer un hachage unique pour un champ dans SQL Server in-sql-server
La longueur de stockage du type varchar sera +2.
Solution
ALTER TABLE table_name
ALTER COLUMN column_name varchar(255)
essayez donc de réduire la longueur de la colonne à 255 caractères et essayez l'indexation.
Il semble que vous exécutiez Microsoft SQL Server. Consultez Microsoft: taille maximale des clés d'index pour plus d'informations sur ce sujet. Ou une réponse connexe dans: 900 octets limite de taille d'index en longueur de caractères
La longueur combinée de toutes les colonnes doit être inférieure à 900.
-- make combined colum length(to be indexed / add constrains) less <= 900
ALTER TABLE tabbleName ALTER COLUMN col1 VARCHAR (500) NULL;
ALTER TABLE tabbleName ALTER COLUMN col2 VARCHAR (200) NULL;
ALTER TABLE tabbleName ALTER COLUMN col3 VARCHAR (200) NULL;
-- Then add the index
ALTER TABLE tabbleName ADD CONSTRAINT uck UNIQUE (col1, col2, col3);