none
Impossible d'ajouter une colonne RRS feed

  • Discussion générale

  • Bonjour,

    Plateforme : SQL Server Express 2008

    J'ai une procédure stockée qui crée un table à partir de diverses autres tables.

    Cette dernière a tj bien fonctionné. Maintenant il suffit que je rajoute une colonne pour obtenir le message suivant :

    Msg 213, Niveau 16, État 1, Procédure genereTable_etudiants, Ligne 172

    Le nom ou le numéro de colonne des valeurs fournies ne correspond pas à la définition de la table.

     

    Lorsque je vérifie le mappage entre le Create et l'Insert Values tout est ok.

    D'ailleurs il suffit que j'enlève n'importe quelle colonne (dans le Create et dans l'Insert Value) pour que cela fonctionne.

    Jusqu'à 24 colonnes tout va bien, au delà j'ai le message d'erreur.

    Y a t-il une limite au nombre de colonne ?...

    Cordialement

    Thierry

     


    Cordialement, Thierry
    • Type modifié Ciprian Duduiala vendredi 23 septembre 2011 06:13 attente de feedback
    jeudi 15 septembre 2011 09:35

Toutes les réponses


  • Y a t-il une limite au nombre de colonne ?...


    Oui, mais bien au delà de 24 : http://msdn.microsoft.com/fr-fr/library/ms143432.aspx
    Par contre la limite de taille de la ligne est peut-être atteinte.

    Pour en dire plus il faudrait davantage de précision sur la procédure. L'erreur n'apparaît pas à la création de la table ?

    Fred
    jeudi 15 septembre 2011 11:15
  • Bonjour,

    La procédure a été recompilée ?

    Les instructions indiquent elles toutes explicitement le nom des colonnes ? Si non, voir ce que cela donne si on le fait. Mon  arrière pensée est que qq chose comme INSERT INTO Destination SELECT * FROM Source1 JOIN Source2 etc... pourrait peut-être provoquer des problèmes si on a un même nom de colonne dans deux tables ou si l'ordre implicite n'est pas le même pour la destination et la (les) sources.

    Eventuellement utiliser ne serait ce que temporairement SELECT * INTO Destination FROM Source1 JOIN Source2 etc... ce qui crée automatiquement la table de Destination permettrait de voir la structure que cela donne et de vérifier si elle est bien identique à celle que l'on crée actuellement explicitement dans le code.

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    • Modifié Patrice ScribeMVP jeudi 15 septembre 2011 11:42 Diverses fautes de frappes
    jeudi 15 septembre 2011 11:38
  • Bonjour,
    J'avais hésité à fournir la procédure vu sa taille... la voici.
    En fait l'erreur apparaît sur la ligne - FETCH NEXT FROM curInfos INTO @nomP,@valeurP -
    Il suffit que je supprime une des propriétés, n'importe la quelle (par exemple le prénom), pour que cela fonctionne.


    DECLARE @nom nvarchar(100), @login nvarchar(50), @email nvarchar(100), @id uniqueidentifier, @photo nvarchar(255)
    DECLARE curID CURSOR FOR
    SELECT    dbo.mp_Users.Name, dbo.mp_Users.LoginName, dbo.mp_Users.Email, dbo.mp_Users.UserGuid, dbo.mp_Users.AvatarUrl
    FROM         mp_Users INNER JOIN  mp_UserRoles ON mp_Users.UserID = mp_UserRoles.UserID
    WHERE   RoleID=8
    ORDER BY [Name]

    DECLARE @prenom nvarchar(80),
     @classe nvarchar(6),
     @groupe nvarchar(1),
     @adresse nvarchar(80),
     @codePostal nvarchar(5),
     @ville nvarchar(40),
     @webUrl nvarchar(100),
     @cvUrl nvarchar(100),
     @mobile nvarchar(10),
     @tel nvarchar(10),
     @internet bit,
     @portefeuilleUrl nvarchar(200),
     @option nvarchar(20),
     @sectionOrigine nvarchar(80),
     @delegue nvarchar(10),
     @anEntree nvarchar(4),
     @entrepriseNom nvarchar(40),
     @entrepriseVille nvarchar(40),
     @entrepriseActivite nvarchar(80),
     @entrepriseWebUrl nvarchar(100),
     @tuteurNomPrenom nvarchar(80),
     @tuteurEmail nvarchar(80),
     @tuteurTel nvarchar(10),
     @sujet nvarchar(400),
     @suivi nvarchar(40)

    IF OBJECT_ID(N'dbo.Etudiants', N'U') IS NOT NULL
    BEGIN
      DROP TABLE dbo.Etudiants;
    END

    CREATE TABLE dbo.Etudiants(
    [id] uniqueidentifier NOT NULL PRIMARY KEY,
    [nom] nvarchar(100) NOT NULL,
    [prenom] nvarchar(80) NULL,
    [login] nvarchar(50) NULL,
    [email] nvarchar(100) NOT NULL,
    [classe] nvarchar(6) NULL,
    [groupe] nvarchar(1) NULL,
    [adresse] nvarchar(80) NULL,
    [codePostal] nvarchar(5) NULL,
    [ville] nvarchar(40) NULL,
    [webUrl] nvarchar(100) NULL,
    [cvUrl] nvarchar(100) NULL,
    [mobile] nvarchar(10) NULL,
    [tel] nvarchar(10) NULL,
    [internet] bit NULL,
    [portefeuilleUrl] nvarchar(200) NULL,
    [option] nvarchar(20) NULL,
    [sectionOrigine] nvarchar(80) NULL,
    [delegue] nvarchar(10) NULL,
    [anEntree] nvarchar(4) NULL,
    [photo] nvarchar(255) NULL,
    [entrepriseNom] nvarchar(40) NULL,
    [entrepriseVille]  nvarchar(40) NULL,
    [entrepriseActivite]  nvarchar(80) NULL,
    [entrepriseWebUrl]  nvarchar(100) NULL,
    [tuteurNomPrenom]  nvarchar(80) NULL,
    [tuteurEmail]  nvarchar(80) NULL,
    [tuteurTel]  nvarchar(10) NULL,
    [sujet]  nvarchar(400) NULL,
    [suivi]  nvarchar(40) NULL)

    -- Parcours des étudiants 
    OPEN curID
    FETCH NEXT FROM curID INTO @nom, @login, @email, @id, @photo
    WHILE @@FETCH_STATUS = 0
    BEGIN
     
      -- Sélection des propirétés d'un étudiant
     DECLARE @nomP nvarchar(255), @valeurP nvarchar(max)
     DECLARE curInfos CURSOR FOR
     SELECT PropertyName,PropertyValueString
     FROM dbo.mp_UserProperties
     WHERE UserGuid=@id
     AND  ( (dbo.mp_UserProperties.PropertyName = N'classe') OR
       (dbo.mp_UserProperties.PropertyName = N'groupe') OR
       (dbo.mp_UserProperties.PropertyName = N'adresse') OR
       (dbo.mp_UserProperties.PropertyName = N'codePostal') OR
       (dbo.mp_UserProperties.PropertyName = N'ville') OR
       (dbo.mp_UserProperties.PropertyName = N'webUrl') OR
       (dbo.mp_UserProperties.PropertyName = N'cvUrl') OR
       (dbo.mp_UserProperties.PropertyName = N'mobile') OR
       (dbo.mp_UserProperties.PropertyName = N'tel') OR
       (dbo.mp_UserProperties.PropertyName = N'internet') OR
       (dbo.mp_UserProperties.PropertyName = N'portefeuilleUrl') OR
       (dbo.mp_UserProperties.PropertyName = N'option') OR
       (dbo.mp_UserProperties.PropertyName = N'sectionOrigine') OR
       (dbo.mp_UserProperties.PropertyName = N'delegue') OR
       (dbo.mp_UserProperties.PropertyName = N'anEntree') OR
       (dbo.mp_UserProperties.PropertyName = N'prenom') OR
       (dbo.mp_UserProperties.PropertyName = N'entrepriseNom') OR
       (dbo.mp_UserProperties.PropertyName = N'entrepriseVille') OR
       (dbo.mp_UserProperties.PropertyName = N'entrepriseActivite') OR
       (dbo.mp_UserProperties.PropertyName = N'entrepriseWebUrl') OR
       (dbo.mp_UserProperties.PropertyName = N'tuteurNomPrenom') OR
       (dbo.mp_UserProperties.PropertyName = N'tuteurEmail') OR
       (dbo.mp_UserProperties.PropertyName = N'tuteurTel') OR
       (dbo.mp_UserProperties.PropertyName = N'sujet') OR
       (dbo.mp_UserProperties.PropertyName = N'suivi'))
     
     -- Parcours des propriétés
     OPEN curInfos
     FETCH NEXT FROM curInfos INTO @nomP, @valeurP
     print @@error
     WHILE @@FETCH_STATUS = 0
     BEGIN 
      IF @nomP='prenom' SET @prenom=@valeurP
      ELSE IF @nomP='classe' SET @classe=@valeurP
      ELSE IF @nomP='groupe' SET @groupe=@valeurP
      ELSE IF @nomP='adresse' SET @adresse=@valeurP
      ELSE IF @nomP='codePostal' SET @codePostal=@valeurP
      ELSE IF @nomP='ville'  SET @ville=@valeurP
      ELSE IF @nomP='webUrl'  SET @webUrl=@valeurP
      ELSE IF @nomP='cvUrl'   SET @cvUrl=@valeurP
      ELSE IF @nomP='mobile'   SET @mobile=@valeurP
      ELSE IF @nomP='tel'   SET @tel=@valeurP   
      ELSE IF @nomP='internet'  SET @internet=@valeurP
      ELSE IF @nomP='portefeuilleUrl'  SET @portefeuilleUrl=@valeurP
      ELSE IF @nomP='option'   SET @option=@valeurP
      ELSE IF @nomP='sectionOrigine'  SET @sectionOrigine=@valeurP
      ELSE IF @nomP='delegue'   SET @delegue=@valeurP
      ELSE IF @nomP='anEntree'  SET @anEntree=@valeurP
      ELSE IF @nomP='entrepriseNom'  SET @entrepriseNom=@valeurP
      ELSE IF @nomP='entrepriseVille'   SET @entrepriseVille=@valeurP
      ELSE IF @nomP='entrepriseActivite'  SET @entrepriseActivite=@valeurP
      ELSE IF @nomP='entrepriseWebUrl'  SET @entrepriseWebUrl=@valeurP
      ELSE IF @nomP='tuteurNomPrenom'   SET @tuteurNomPrenom=@valeurP
      ELSE IF @nomP='tuteurEmail'   SET @tuteurEmail=@valeurP
      ELSE IF @nomP='tuteurTel'   SET @tuteurTel=@valeurP
      ELSE IF @nomP='sujet'    SET @sujet=@valeurP
      ELSE IF @nomP='suivi'    SET @suivi=@valeurP
      FETCH NEXT FROM curInfos INTO @nomP,@valeurP -- ERREUR SIGNALEE ICI --
     END
     CLOSE curInfos
     DEALLOCATE curInfos
      
     IF @classe='10' OR @classe='12' OR @classe='20'
     BEGIN
      INSERT INTO  dbo.Etudiants
      VALUES(@id,@nom,@prenom,@login,@email,@classe,@groupe,@adresse,@codePostal,@ville,@webUrl,@cvUrl,@mobile,@tel,@internet,@portefeuilleUrl,@option,@sectionOrigine,@delegue,@anEntree,@photo,@entrepriseNom,@entrepriseVille,@entrepriseActivite,@entrepriseWebUrl,@tuteurNomPrenom,@tuteurEmail,@tuteurTel,@sujet,@suivi);
     END
      FETCH NEXT FROM curID INTO @nom, @login, @email, @id, @photo
    END
    CLOSE curID
    DEALLOCATE curID

    Cordialement
    Thierry


    Cordialement, Thierry
    jeudi 15 septembre 2011 13:13
  • Je ne vois pas bien le lien entre l'erreur et la ligne sur laquelle elle
    est signalée.
    Que donne la même procédure sans les ELSE ?
    Il n'y a pas de limite précise au nombre d'imbrications que l'on peut
    faire car cela dépend de la mémoire disponible mais cela pourrait
    peut-être être le cas ici ?
     

    Fred
    vendredi 16 septembre 2011 08:55
  • Bonjour,

    C'est bien le pbm je ne vois pas non plus le lien...

    Lorsque vous parlez de mémoire vous voulez dire directement RAM ?

    Dès que je peux je teste la même procédure sans les ELSE.

    Merci bcp.

    Cordialement,

    Thierry


    Cordialement, Thierry
    vendredi 16 septembre 2011 12:15
  • Bonjour, Thierry,

    Est-ce que vous avez des nouvelles pour nous ? Merci de tenir la communauté informée sur la suite de vos démarches.

     

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    lundi 19 septembre 2011 06:00
  • Bonjour,
    Merci pour l'intérêt que vous portez au problème.
    La requête sans les ELSE pose le même problème.
    Je ne suis pas un spécialiste de SQL Server du coup je ne vois plus dans quelle direction chercher.
    Le message d'erreur semble être un effet de bord, compte tenu de la ligne en erreur, je ne vois pas le lien...
    Il suffit en effet que j'enlève un champ dans le CREATE TABLE Etudiants et dans le INSERT VALUES (sans rien changer ailleurs) pour que la requête passe, dès qu'il y a 30 champs dans la table Etudiants la requête échoue sur le FETCH NEXT du curseur curInfos.

    Cordialement,

    Thierry 


    Cordialement, Thierry
    mardi 20 septembre 2011 08:29
  • Bonjour,

    Je ne vois pas le lien entre l’erreur et la ligne où l’erreur est signalée. Est-ce qu’on peut avoir le schéma des tables mp_Users, mp_UserProperties et mp_UserRoles pour essayer reproduire votre erreur ?

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    mercredi 21 septembre 2011 07:55
  • Bonjour,

    J'ai fini par bidouiller une solution en concaténant plusieurs champs pour ne pas en avoir plus de 29 et c'est l'appli cliente qui sera chargé de les splitter.

    Ce n'est pas satisfaisant mais bon ça a le mérite de fonctionner en attendant...

    Voici les requêtes pour créer les 3 tables, encore merci pour votre aide.

    mp_Users

    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[mp_Users](
    	[UserID] [int] IDENTITY(1,1) NOT NULL,
    	[SiteID] [int] NOT NULL,
    	[Name] [nvarchar](100) NOT NULL,
    	[LoginName] [nvarchar](50) NULL,
    	[Email] [nvarchar](100) NOT NULL,
    	[LoweredEmail] [nvarchar](100) NULL,
    	[Password] [nvarchar](128) NOT NULL,
    	[PasswordQuestion] [nvarchar](255) NULL,
    	[PasswordAnswer] [nvarchar](255) NULL,
    	[Gender] [nchar](10) NULL,
    	[ProfileApproved] [bit] NOT NULL,
    	[RegisterConfirmGuid] [uniqueidentifier] NULL,
    	[ApprovedForForums] [bit] NOT NULL,
    	[Trusted] [bit] NOT NULL,
    	[DisplayInMemberList] [bit] NULL,
    	[WebSiteURL] [nvarchar](100) NULL,
    	[Country] [nvarchar](100) NULL,
    	[State] [nvarchar](100) NULL,
    	[Occupation] [nvarchar](100) NULL,
    	[Interests] [nvarchar](100) NULL,
    	[MSN] [nvarchar](50) NULL,
    	[Yahoo] [nvarchar](50) NULL,
    	[AIM] [nvarchar](50) NULL,
    	[ICQ] [nvarchar](50) NULL,
    	[TotalPosts] [int] NOT NULL,
    	[AvatarUrl] [nvarchar](255) NULL,
    	[TimeOffsetHours] [int] NOT NULL,
    	[Signature] [nvarchar](255) NULL,
    	[DateCreated] [datetime] NOT NULL,
    	[UserGuid] [uniqueidentifier] NULL,
    	[Skin] [nvarchar](100) NULL,
    	[IsDeleted] [bit] NOT NULL,
    	[LastActivityDate] [datetime] NULL,
    	[LastLoginDate] [datetime] NULL,
    	[LastPasswordChangedDate] [datetime] NULL,
    	[LastLockoutDate] [datetime] NULL,
    	[FailedPasswordAttemptCount] [int] NULL,
    	[FailedPwdAttemptWindowStart] [datetime] NULL,
    	[FailedPwdAnswerAttemptCount] [int] NULL,
    	[FailedPwdAnswerWindowStart] [datetime] NULL,
    	[IsLockedOut] [bit] NOT NULL,
    	[MobilePIN] [nvarchar](16) NULL,
    	[PasswordSalt] [nvarchar](128) NULL,
    	[Comment] [ntext] NULL,
    	[OpenIDURI] [nvarchar](255) NULL,
    	[WindowsLiveID] [nvarchar](36) NULL,
    	[SiteGuid] [uniqueidentifier] NULL,
    	[TotalRevenue] [decimal](15, 4) NULL,
     CONSTRAINT [PK_mp_Users] PRIMARY KEY CLUSTERED 
    (
    	[UserID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[mp_Users] ADD  CONSTRAINT [DF_Users_ProfileApproved]  DEFAULT ((1)) FOR [ProfileApproved]
    GO
    
    ALTER TABLE [dbo].[mp_Users] ADD  CONSTRAINT [DF_Users_Approved]  DEFAULT ((1)) FOR [ApprovedForForums]
    GO
    
    ALTER TABLE [dbo].[mp_Users] ADD  CONSTRAINT [DF_Users_Trusted]  DEFAULT ((0)) FOR [Trusted]
    GO
    
    ALTER TABLE [dbo].[mp_Users] ADD  CONSTRAINT [DF_mp_Users_DisplayInMemberList]  DEFAULT ((1)) FOR [DisplayInMemberList]
    GO
    
    ALTER TABLE [dbo].[mp_Users] ADD  CONSTRAINT [DF_Users_TotalPosts]  DEFAULT ((0)) FOR [TotalPosts]
    GO
    
    ALTER TABLE [dbo].[mp_Users] ADD  CONSTRAINT [DF_mp_Users_AvatarUrl]  DEFAULT ('blank.gif') FOR [AvatarUrl]
    GO
    
    ALTER TABLE [dbo].[mp_Users] ADD  CONSTRAINT [DF_mp_Users_TimeOffSetHours]  DEFAULT ((0)) FOR [TimeOffsetHours]
    GO
    
    ALTER TABLE [dbo].[mp_Users] ADD  CONSTRAINT [DF_Users_DateCreated]  DEFAULT (getdate()) FOR [DateCreated]
    GO
    
    ALTER TABLE [dbo].[mp_Users] ADD  CONSTRAINT [DF_mp_Users_UserGuid]  DEFAULT (newid()) FOR [UserGuid]
    GO
    
    ALTER TABLE [dbo].[mp_Users] ADD  CONSTRAINT [DF_mp_Users_IsDeleted]  DEFAULT ((0)) FOR [IsDeleted]
    GO
    
    ALTER TABLE [dbo].[mp_Users] ADD  CONSTRAINT [DF_mp_Users_IsLockedOut]  DEFAULT ((0)) FOR [IsLockedOut]
    GO
    
    

    mp_UserProperties

    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[mp_UserProperties](
    	[PropertyID] [uniqueidentifier] NOT NULL,
    	[UserGuid] [uniqueidentifier] NOT NULL,
    	[PropertyName] [nvarchar](255) NULL,
    	[PropertyValueString] [ntext] NULL,
    	[PropertyValueBinary] [image] NULL,
    	[LastUpdatedDate] [datetime] NOT NULL,
    	[IsLazyLoaded] [bit] NOT NULL,
     CONSTRAINT [PK_mp_UserProperties] PRIMARY KEY CLUSTERED 
    (
    	[PropertyID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[mp_UserProperties] ADD  CONSTRAINT [DF_mp_UserProperties_PropertyID]  DEFAULT (newid()) FOR [PropertyID]
    GO
    
    ALTER TABLE [dbo].[mp_UserProperties] ADD  CONSTRAINT [DF_mp_UserProperties_LastUpdatedDate]  DEFAULT (getdate()) FOR [LastUpdatedDate]
    GO
    
    ALTER TABLE [dbo].[mp_UserProperties] ADD  CONSTRAINT [DF_mp_UserProperties_IsLazyLoaded]  DEFAULT ((0)) FOR [IsLazyLoaded]
    GO
    
    
    

     mp_UserRoles

    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE TABLE [dbo].[mp_UserRoles](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[UserID] [int] NOT NULL,
    	[RoleID] [int] NOT NULL,
    	[UserGuid] [uniqueidentifier] NULL,
    	[RoleGuid] [uniqueidentifier] NULL,
     CONSTRAINT [PK_mp_UserRoles] PRIMARY KEY CLUSTERED 
    (
    	[ID] 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
    
    
    


    Cordialement,

    Thierry

     


    Cordialement, Thierry
    vendredi 23 septembre 2011 07:46
  • Bonjour,

    J’ai essayé à reproduire votre erreur, mais je n’ai pas réussi. J’ai créé les tables dont on a besoin pour la procédure stockée et j’ai pu exécuter la procédure sans souci.

     

    Vu qu’on a des informations différentes dans la base des données il n’est pas facile à déterminer d’où vient votre problème, mais il y a une chose que ne me semble pas correcte : la variable @valeurP du type nvarchar(max) qui représente dans le curseur curInfos le champ mp_UserProperties.PropertyValueString du type ntext et puis sa valeur est assignée aux variables de types diverses même du type bit comme @internet et je ne recommande pas ce type d’assignements.

     

    Je crois  qu’il faut vérifier l’intégrité de votre base de données pour être sûr que toutes les informations que vous utilisez sont correctes et respectent les définitions des colonnes de vos tables.

     

    Sinon, je crois qu’il faut contacter Microsoft Support parce qu’il peuvent reproduire le contexte de votre erreur avec les informations que vous avez dans la base de données.

     

    Cordialement,

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    vendredi 23 septembre 2011 12:19