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 :

Échec de la conversion de la valeur varchar en type de données int. [2012]


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 337
    Points : 120
    Points
    120
    Par défaut Échec de la conversion de la valeur varchar en type de données int.
    Mon code sql ne marche pas

    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
    31
    32
    33
    34
    35
    36
     
    ALTER PROCEDURE [dbo].[ComparaisonDePeriode]
    @ValeurAffichage nvarchar(200),
    @ValeurCompare nvarchar(200),
    @Chaine nvarchar(225),
    @ChaineFiltre nvarchar(225),
    @NomElt nvarchar(25),
    @NomValeur nvarchar(25),
    @NombreCompare nvarchar(4),
    @OperateurComparaison nvarchar(5),
    @ChaineHaving nvarchar(25),
    @Titre nvarchar(200),
     
    @PeriodeFin int,
    @NombrePeriodeCompare int,
    @Annee int,
    @PeriodeCompare nvarchar(15)
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    SET NOCOUNT ON;
    declare @SqlCommand nvarchar(3000)
    declare @SqlCommandMoisArticleQuantite nvarchar(3000)
    declare @SqlCommandMoisArticleBeneficeVente nvarchar(3000)
    declare @SqlCommandMoisArticleMontantDesQuantite nvarchar(3000)
     
    set @SqlCommandMoisArticleQuantite='SELECT nom+'' (''+CodeArticle+'')'' as Elt,datename(MONTH,dateoperation)+'' ''+cast(case when 
    MONTH(dateoperation)>'+@PeriodeFin+' then '+@Annee-1+' else '+@Annee+' end as nvarchar) as Periode,sum(V) as V,'''+@ChaineFiltre+''' as 
    ChaineFiltre,'''+@Titre+''' as Titre,case when MONTH(dateoperation)>'+@PeriodeFin+' then MONTH(dateoperation)-12 else MONTH(dateoperation) 
    end as NbP from bilan_quantite_general inner join p_article on bilan_quantite_general.codearticle=p_article.code where (clfo=''client'') and 
    ((month(dateoperation) between  '+@Periodefin-@NombrePeriodeCompare+13+' and 12) and (year(dateoperation)='+@annee-1+')) or 
    ((month(dateoperation) between 1 and '+@Periodefin+') and (year(dateoperation)='+@annee+')) group by nom+'' 
    (''+CodeArticle+'')'',datename(MONTH,dateoperation)+'' ''+cast(case when MONTH(dateoperation)>'+@PeriodeFin+' then '+@Annee-1+' else '
    +@Annee+' end as nvarchar),case when MONTH(dateoperation)>'+@PeriodeFin+' then MONTH(dateoperation)-12 else MONTH(dateoperation) 
    end'
    Voilà le code d'exécution

    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
    USE [LEHI]
    GO
     
    DECLARE	@return_value int
     
    EXEC	@return_value = [dbo].[ComparaisonDePeriode]
    		@ValeurAffichage = N'ARTICLES',
    		@ValeurCompare = N'QUANTITE',
    		@Chaine = N'',
    		@ChaineFiltre = N'',
    		@NomElt = N'',
    		@NomValeur = N'',
    		@NombreCompare = N'5',
    		@OperateurComparaison = N'PLUS',
    		@ChaineHaving = N'',
    		@Titre = N'',
    		@PeriodeFin = 2,
    		@NombrePeriodeCompare = 3,
    		@Annee = 2015,
    		@PeriodeCompare = N'MOIS'
     
    SELECT	'Return Value' = @return_value
     
    GO
    et le message d'erreur suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Msg*245, Niveau*16, État*1, Procédure*ComparaisonDePeriode, Ligne*35
    Échec de la conversion de la valeur varchar 'nom+' ('+CodeArticle+')' as Elt,datename(MONTH,dateoperation)+' '+cast(case when MONTH(dateoperation)>' 
    en type de données int.
    Et pourtant, quand je code en dur, ça marche sans problème. Tous mes efforts sont vains.
    j'ai grand besoin d'un coup de pouce

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Cette syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC	@return_value = [dbo].[ComparaisonDePeriode]
    Est une abomination.

    Je ne sais pas ou vous l'avez pêchée, mais en ce moment elle semble être à la mode sur Internet. Elle est juste stupide et syntaxiquement bancale.
    Si vous voulez une valeur de retour il faut mettre un paramètre en OUTPUT.
    La valeur de retour d'une procédure est son code d'erreur ! Ce que vous récupérez dans @return_value est un entier qui indique s'il y a eu une erreur ou pas (0 si pas d’erreur).

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXEC	[dbo].[ComparaisonDePeriode] ... @return_value OUTPUT
    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/ * * * * *

  3. #3
    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,

    Ajoutez un PRINT @SqlCommandMoisArticleQuantite après la construction de la commande, qui vous affichera celle-ci à l'exécution, vous permettant de faire un copier-coller de celle-ci dans une nouvelle fenêtre de requête, et donc de comprendre où se situe le problème.

    Par ailleurs, les prédicats de type MONTH(colonne) sont à corriger puisqu'ils ne sont pas cherchables.

    @++

  4. #4
    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,

    Vous devez convertir explicitement vos types numériques (INT, ...) vers du VARCHAR lors de la concaténation. Sans quoi, selon la précédence des types, SQL server tente de convertir votre VARCHAR en INT, ce qui, forcément, fonctionne beaucoup moins bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ... ' then '+ CAST(@Annee-1 AS VARCHAR) +' else ' ...



    Citation Envoyé par SQLpro Voir le message
    Je ne sais pas ou vous l'avez pêchée, mais en ce moment elle semble être à la mode sur Internet. Elle est juste stupide et syntaxiquement bancale
    C'est la syntaxe générée par SSMS lorsqu'on exécute une procédure stockée....

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    337
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 337
    Points : 120
    Points
    120
    Par défaut
    c'est aieeeuuuuu qui avait raison.
    quand je code en dur, je n'ai pas besoin de convertir.
    Mille mercis encore une fois pour le temps que vous me consacrez et les éclairages que vous m'apportez

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 03/06/2016, 11h18
  2. Réponses: 11
    Dernier message: 11/08/2014, 21h14
  3. Réponses: 1
    Dernier message: 21/02/2011, 21h30
  4. Réponses: 1
    Dernier message: 13/02/2010, 13h44

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