IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Erreur 1701 : taille maximale autorisée 8060*octets


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Points : 73
    Points
    73
    Par défaut Erreur 1701 : taille maximale autorisée 8060*octets
    Bonjour à tous,

    Je conçoit une nouvelle base de données, jusqu'ici tout va bien...
    Sauf qu'en voulant modifier le type de donnée d'une colonne j'ai l'erreur suivante :
    Msg*1701, Niveau*16, État*1, Ligne*1
    Échec de création ou de modification de la table 'tbl_clients' parce que la taille minimale des lignes serait de 8064, 9 octets d'espace réservé interne compris. Cela dépasse la taille maximale autorisée pour les lignes de la table de 8060*octets.
    Dans cette j'avais 5 colonnes nchar(1000) et 2 nvarchar(MAX), ce qui à priori ne doit pas poser de problème.
    J'ai donc déporté ces colonnes sur une autre table et j'ai toujours le même problème.

    Voici le script de création :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE [dbo].[tbl_clients](
        [id_personne] [int] NOT NULL,
        [client_date_creation] [date] NULL,
        [client_nom_jeune_fille] [nvarchar](50) NULL,
        [client_num_ss] [nchar](14) NULL,
        [id_medecin] [int] NULL,
        [id_referent] [int] NULL,
        [date_ordonnance] [date] NULL,
        [id_mode_rappel] [tinyint] NULL,
     CONSTRAINT [PK_tbl_clients] PRIMARY KEY CLUSTERED
    Mes recherches n'ont rien donné, je fais donc appel à vos connaissances.
    D'avance merci pour vos réponses.

    Bonne journée,
    Pierre-Yves

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    5 colonnes nchar(1000) et 2 nvarchar(MAX), ce qui à priori ne doit pas poser de problème.
    Si justement 5 nchar(1000) = 5 X 2 X 1000 = 10 000 octets !

    que stockez vous dans ces colonnes ?

    vous pouvez passer en varchar(1000) ou nvarchar(1000).

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    De plus, utiliser du NVARCHAR pour des données latines c'est doubler le volume de la base pour rien !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Points : 73
    Points
    73
    Par défaut
    Bonjour et merci pour vos réponses.
    Même en supprimant les colonnes nchar(1000) j'ai le même problème ?

    Dois-je supprimer et recréer la table ?

    SQlpro>Merci pour la remarque

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE [dbo].[tbl_clients](
    [id_personne] [int] NOT NULL,
    [client_date_creation] [date] NULL,
    [client_nom_jeune_fille] [nvarchar](50) NULL,
    [client_num_ss] [nchar](14) NULL,
    [id_medecin] [int] NULL,
    [id_referent] [int] NULL,
    [date_ordonnance] [date] NULL,
    [id_mode_rappel] [tinyint] NULL,
    CONSTRAINT [PK_tbl_clients] PRIMARY KEY CLUSTERED
    Je ne vois pas où sont les 5 colonnes nchar(1000) ...
    Et le script est incomplet puisque les colonnes qui participent à la clé primaire ne sont pas spécifiées.

    Sauf qu'en voulant modifier le type de donnée d'une colonne j'ai l'erreur suivante :
    Quelle est l'instruction qui a provoqué cette erreur ?

    Et pourquoi nchar(1000) ?

    - en n[var]char, vous utilisez Unicode, donc deux octets par caractère, contrairement à [var]char qui lui utilise ASCII et donc un seul octet par caractère

    - en utilisant du [n]char(1000), quelle que soit la longueur réelle des valeurs de chaîne de caractère que vous stockez dans une colonne de ce type, celles-ci occuperont de toute façon [2000] 1000 octets.
    Est-ce bien nécessaire ? Passez en n[var]char !

    N'utilisez Unicode que si vous allez stocker des chaînes dont les caractères peuvent être non-latins (provenant des langues asiatiques, de l'arabe, et bien d'autres, ...)

    @++

  6. #6
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Points : 73
    Points
    73
    Par défaut
    Merci pour la remarque sur la différence de stockage nvarchar et varchar.

    Mais malgré l'absence de ces colonnes "gargantuesques" l'erreur est toujours là...

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Postez le DDL de la table et le script de modification que vous tentez d'executer

  8. #8
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Points : 73
    Points
    73
    Par défaut
    Bonsoir,

    Je n'ai pas eu le temps de répondre avant mais voici les infos.
    Script de création de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    CREATE TABLE [dbo].[tbl_clients](
        [id_personne] [int] NOT NULL,
        [client_date_creation] [date] NULL,
        [client_nom_jeune_fille] [nvarchar](50) NULL,
        [client_num_ss] [nchar](14) NULL,
        [id_medecin] [int] NULL,
        [id_referent] [smallint] NULL,
        [date_ordonnance] [date] NULL,
        [id_mode_rappel] [tinyint] NULL,
     CONSTRAINT [PK_tbl_clients] PRIMARY KEY CLUSTERED 
    (
        [id_personne] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
     
    ALTER TABLE [dbo].[tbl_clients]  WITH CHECK ADD  CONSTRAINT [FK_tbl_clients_tbl_clients_modes_rappel] FOREIGN KEY([id_mode_rappel])
    REFERENCES [dbo].[tbl_clients_modes_rappel] ([id_mode_rappel])
    GO
     
    ALTER TABLE [dbo].[tbl_clients] CHECK CONSTRAINT [FK_tbl_clients_tbl_clients_modes_rappel]
    GO
     
    ALTER TABLE [dbo].[tbl_clients]  WITH CHECK ADD  CONSTRAINT [FK_tbl_clients_tbl_personnes] FOREIGN KEY([id_personne])
    REFERENCES [dbo].[tbl_personnes] ([id_personne])
    GO
     
    ALTER TABLE [dbo].[tbl_clients] CHECK CONSTRAINT [FK_tbl_clients_tbl_personnes]
    GO
    Et enfin en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE tbl_clients ALTER COLUMN id_referent int
    J'ai l'erreur suivante :
    Msg*1701, Niveau*16, État*1, Ligne*1
    Échec de création ou de modification de la table 'tbl_clients' parce que la taille minimale des lignes serait de 8064, 9 octets d'espace réservé interne compris. Cela dépasse la taille maximale autorisée pour les lignes de la table de 8060*octets.
    Je vous remercie pour l'aide déjà apportée et pour celle que vous pourrez me fournir.
    Bonne soirée,
    Kri

  9. #9
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Enfin quelque chose de précis !
    Vous remarquerez que si vous aviez respecté la charte de postage du forum, nous aurions tous été plus vite

    Maintenant si je prends ce qui nous intéresse dans votre script, j'ai un peu de mal à y croire :

    - la colonne id_personne est de type int, donc toute valeur y occupe 4 octets
    - la colonne client_date_creation est de type date, donc toute valeur y occupe 3 octets
    - la colonne client_nom_jeune_fille est de type nvarchar(50), donc dans le pire des cas toute valeur y occupe au maximum 100 octets
    - client_num_ss est de type nchar(14), donc toute valeur occupe 28 octets
    - id_medecin est de type int, donc toute valeur y occupe 4 octets
    - id_referent est de type smallint, donc toute valeur y occupe 2 octets
    - date_ordonnance est de type date, donc toute valeur y occupe 3 octets
    - id_mode_rappel est de type tinyint, donc toute valeur y occupe 1 octet

    Si nous faisons maintenant la somme des tailles des colonnes, nous sommes au maximum à 145 octets ...

    Si j'exécute le lot suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    CREATE TABLE [dbo].[tbl_clients](
    [id_personne] [int] NOT NULL,
    [client_date_creation] [date] NULL,
    [client_nom_jeune_fille] [nvarchar](50) NULL,
    [client_num_ss] [nchar](14) NULL,
    [id_medecin] [int] NULL,
    [id_referent] [smallint] NULL,
    [date_ordonnance] [date] NULL,
    [id_mode_rappel] [tinyint] NULL,
    CONSTRAINT [PK_tbl_clients] PRIMARY KEY CLUSTERED
    (
    [id_personne] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
     
    ALTER TABLE tbl_clients ALTER COLUMN id_referent int
    J'obtiens :

    Command(s) completed successfully.
    Il est donc impossible que cette erreur se produise pour cette table, et les clés étrangères que j'ai du omettre pour que le script s'exécute n'y sont absolument pour rien.

    Pour la colonne client_nom_jeune_fille, prévoyez-vous de stocker des caractères non-latins (provenant des alphabets asiatiques, arabe, hébreux, russe, sanscrit, ...) ? Si non, passez en varchar.

    Pour la colonne client_num_ss, s'agit-il du numéro de sécurité sociale ?
    Si tel est le cas, et si j'en crois ce que j'ai lu sur Wikipédia :

    - il peut comprendre 15 caractères
    - dans la mesure où ce sont uniquement des chiffres et que le premier chiffre ne peut pas être un zéro, pourquoi ne les avez-vous pas stocké dans une colonne de type entier ?
    Avec un bigint vous seriez à 8 octets, sans compter la vitesse de recherche d'un bigint comparée à une chaîne de caractères.
    Comme il est en plus probable que vous indexiez cette colonne, l'index sera plus petit, donc son parcours sera plus rapide

    @++

  10. #10
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Points : 73
    Points
    73
    Par défaut
    Bonjour et merci pour votre réponse (promis je relis la charte ).

    Finalement j'ai résolu le problème en supprimant et re-créant la table.

    J'ai l'impression que SQL-server avait "gardé en mémoire" les colonnes nvarchar créées précédemment

    En tout les cas merci à tous pour vos conseils sur l'utilisation des types de données, je suis autodidacte et je suis friand d'avis sur mon travail.

    Bonne journée à tous

  11. #11
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    J'ai l'impression que SQL-server avait "gardé en mémoire" les colonnes nvarchar créées précédemment
    La table a une certaine définition ou elle ne l'a pas.
    SQL Server ne versionne pas les tables

    Vous vous être peut-être fié aux colonnes que vous voyez dans l'explorateur d'objets, mais elle ne sont pas maintenues en tant réel (ce qui est normal, sinon imaginez le coût que cela pourrait avoir !)

    @++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/02/2008, 13h26
  2. Réponses: 4
    Dernier message: 27/07/2006, 22h25
  3. taille maximale d'une base de donnée paradox
    Par Anonymous dans le forum Paradox
    Réponses: 5
    Dernier message: 14/02/2004, 17h39
  4. Réponses: 9
    Dernier message: 29/07/2003, 14h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo