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 :

Problème d'apostrophes et de variables date


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 44
    Par défaut Problème d'apostrophes et de variables date
    Bonjour à tous !
    Je me présente, Valentin, étudiant en BTS Services Informatiques aux Organisations, spécialité Développement et je suis actuellement en stage en entreprise.

    Un de mes projets consiste à développer une application en C# afin de générer des fichiers (PDF et TXT principalement).
    Cependant, le contenu de ses fichiers est le résultat de différentes requêtes que je créer et teste sur DATABASE .NET - SQL SERVER.

    Venons-on aux faits :
    • Premièrement, j'ai créé une procédure stockée qui vide une table et la remplie par la suite grâce à des requêtes, qui récupère entre autre des dates. Le problème avec ses dates est que lorsque j'effectue mon insert, les valeurs insérées sont les valeurs par défaut quand la valeur du champs est "incorrecte" (c-à-d '1900/01/01').
      Après multitude de tests, je me suis rendu compte que l'insert ne pouvait fonctionner que si les dates étaient mises entre apostrophes.
      Voilà ma procédure :
      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
      CREATE PROCEDURE MIM_LoadDemarques AS
      BEGIN
      	DECLARE @leNumPromo INT
      	DECLARE @leCodeArt VARCHAR(20)
      	DECLARE @laSaison INT
      	DECLARE @laDateDeDebut VARCHAR(10)
      	DECLARE @laDateDeFin VARCHAR(10)
      	DECLARE @lePrix FLOAT
       
      	SET @leNumPromo = 0
       
      -- TRUNCATE TABLE Mim_Demarques
       
      	WHILE (@leNumPromo<=10)
      		BEGIN
      			SELECT @leCodeArt = substring(rtrim(codearticle),1,10), 
      				   @laSaison = saison,
      				   @laDateDeDebut = dbo.MIM_ExtraitDateDebutFR(@leCodeArt,@leNumPromo),
      				   @laDateDeFin = dbo.MIM_ExtraitDateFinFR(@leCodeArt,@leNumPromo),
      				   @lePrix = dbo.MIM_ExtraitPrixPromo(@leCodeArt,@leNumPromo)
      			FROM article
      			WHERE codearticle = '013888801001'
       
      			INSERT INTO MIM_Demarques (CodeProduit, Saison, DateDebut, DateFin, Prix)
      				   VALUES (@leCodeArt,@laSaison,@laDateDeDebut,@laDateDeFin,@lePrix)
       
      			SET @leNumPromo = (@leNumPromo + 1)
      		END
      END
      J'ai tout essayé afin d'essayer de pouvoir insérer le caractère ' avant et après les variables dates mais rien ne fonctionne.
      J'ai cherché sur google et sur d’innombrables forums mais personne n'a le même problème que moi (langage, logiciel).

      Ma question est donc de savoir si vous savez comment échapper une quote dans le code.

    • Mon autre problème est que lorsque j'exécute la procédure :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      EXECUTE dbo.MIM_LoadDemarques
      Une erreur apparaît :
      ErrorCode: -2146232060

      [.Net SqlClient Data Provider]
      Number: 245, Class: 16, State: 1, Line: 8
      ErrorMessage: Erreur de syntaxe lors de la conversion de la valeur varchar '*' vers une colonne de type de données int.
      Cependant, l'insert est quand même effectué, mais je n'ai pas de valeur dans les champs date et prix.
      La ligne 8 correspond à la déclaration d'une varaible FLOAT . Et nul part je traite le caractère '*'.
      Je pense que cette erreur est liée à mon premier problème, mais si vous avez une idée, je suis preneur !


    J'espère avoir été assez clair, mais si vous avez des questions, n'hésitez pas.

    Vous remerciant par avance,

    Valentin

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Pour gérer des dates, il y a :

    DATETIME (obsolète sur les versions recentes de SQL Server)
    DATE (absent des vieilles versions de SQL Server)
    DATETIME2 (absent des vieilles versions de SQL Server)

    VARCHAR ne sert pas à manipuler des dates, tout au plus à :
    - interpréter une saisie manuelle
    - effectuer un rendu pour l'utilisateur final

    Donc commence par modifier le type de tes paramètres.

    Ensuite, la valeur littérale d'une date en SQL est toujours sous forme d'une chaîne de caractères (littérale) : donc appostrophes.

    01/01/1900 => C'est 1 divisé par 1 divisé par 1900, pas le premier janvier 1900.

    Dans tous les cas, utilise CONVERT() avec le bon pattern pour convertir proprement la date littérale en type DATE, car '01/02/1900' c'est le premier février pour la France et l'Angleterre, mais le 2 janvier pour les Etats Unis. Donc très important de savoir ce qu'on converti.

    Si tu en as la possibilité, tu peux imposer le format ISO pour la date : '1900-01-01' (YYYY-MM-DD) pas de toute possible pour l'interprétation.

  3. #3
    Membre expérimenté
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Billets dans le blog
    4
    Par défaut
    Tu as oublié l'UTC date (présent depuis SQL Server 2008 il me semble) GETUTCDATE() qui gère en prime l'UTC.


    Lorsque tu saisies une date dans un champ date. Tu as 3 possibilités.
    - Soit la donnée est déjà une date formatée
    - soit tu dois la convertir depuis une chaine de caractère
    - soit ta chaine de caractère est écrite sous un format précis, à savoir 'AAAAMMJJ' ou 'AAAA-MM-JJ' Lorsqu'un INT de ce format est placé entre quote SQL Server va implicitement comprendre qu'il s'agit d'une date, et te permettra l'insertion, ou même un where sur un champ date.


    Je n'ai pas totalement compris le format de sortie de date de tes fonctions de conversion. Pourrais-tu m'en donner un exemple? Et donner le CREATE de ta table par la même occasion?

    Cordialement,
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 44
    Par défaut
    Salut' !

    Déjà, merci de vos réponses.

    @StringBuilder :

    Mes fonctions MIM_ExtraitDateDebutFR et MIM_ExtraitDateFinFR retourne du varchar car à l'intérieur je manipule les caractères afin de retourner un résultat spécifique (tout simplement jj/mm/aaaa, car le convert(datetime, variable) ne le propose pas).
    J'avais essayé convert() et cast(). Pour le convert(), j'avais essayé 103 et 111 comme troisième paramètre. En vain.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    convert(datetime, @laDateDeDebut,103)
    Aujourd'hui j'ai testé le 130/131, et 120. Ce dernier à fonctionné, mais toujours avec des valeurs en dur.

    @Lyche

    Comme je viens de le dire, mes deux fonctions retournent un varchar, car à l'intérieur de ses fonctions, je manipule des caractères issue de requêtes.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select dbo.MIM_ExtraitDateDebutFR('015142301002',1)
    Résultat : Nom : WINSTORE - Database .NET Free (Utilisation non commerciale) - SQL Server (sa@172.16.90.68WINSTOR.jpg
Affichages : 466
Taille : 3,9 Ko

    Et voici le CREATE de la table en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE [dbo].[Mim_Demarques] (
    	[CodeProduit] char NOT NULL, 
    	[Saison] int, 
    	[DateDebut] datetime, 
    	[DateFin] datetime, 
    	[Prix] float
    )
    GO
    CREATE NONCLUSTERED INDEX [Mim_Demarques_pk]
    	ON [dbo].[Mim_Demarques] ([CodeProduit])
    GO
    __________________________________________________________________________________

    Après différents testes, on a trouvé avec un collègue que le problème venait de ce que retourne mes fonctions.
    Quand j'utilise les fonctions et que je tape les paramètres en dur, elle retourne bien un résultat. Par contre, quand je met le nom des variables, la fonction retourne NULL.
    Le problème est donc à un endroit où on ne l'imaginait pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select dbo.MIM_ExtraitDateDebutFR('015142301002',1)
    Me retourne bien une date, sous mon format choisie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @laDateDeDebut = dbo.MIM_ExtraitDateDebutFR(@leCodeArtParam,@leNumPromo),
    @laDateDeDebut = NULL


    Cependant, @leCodeArtParam et @leNumPromo ne sont pas null, ils ont bien les bonnes valeurs..

    Je ne comprend vraiment pas..

  5. #5
    Membre expérimenté
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Billets dans le blog
    4
    Par défaut
    Je viens de réaliser une chose dans ta procédure.

    Voici ton code d'origine :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT @leCodeArt     = substring(rtrim(codearticle),1,10), 
           @laSaison      = saison,
           @laDateDeDebut = dbo.MIM_ExtraitDateDebutFR(@leCodeArt,@leNumPromo),
           @laDateDeFin   = dbo.MIM_ExtraitDateFinFR(@leCodeArt,@leNumPromo),
           @lePrix        = dbo.MIM_ExtraitPrixPromo(@leCodeArt,@leNumPromo)
    FROM article
    WHERE codearticle = '013888801001'

    Dans ta requête tu renseigne le @leCodeArt. ET tu l'exploite dans cette même requête dans tes appels de fonctions. Le problème, c'est qu'il n'est pas encore renseigné! Du coup, c'est comme si tu passais un paramètre qui égale à 0 pour ton premier passage, et pour les autres, passages, il contiendra l'information fournie lors du précédent passage.

    Donc, pour éviter ce problème, il te faudrait ré-utiliser ton substring.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT @leCodeArt     = substring(rtrim(codearticle),1,10), 
           @laSaison      = saison,
           @laDateDeDebut = dbo.MIM_ExtraitDateDebutFR( substring(rtrim(codearticle),1,10),@leNumPromo),
           @laDateDeFin   = dbo.MIM_ExtraitDateFinFR(   substring(rtrim(codearticle),1,10),@leNumPromo),
           @lePrix        = dbo.MIM_ExtraitPrixPromo(   substring(rtrim(codearticle),1,10),@leNumPromo)
    FROM article
    WHERE codearticle = '013888801001'

    Teste avec ça, tu devrais avoir une date qui remonte. Ensuite, on pourra penser à regarder la suite (si problème persistant)

    Cordialement,
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 44
    Par défaut
    Re'


    Alors là, tu as illuminé ma vie !
    C'était donc bien ça le problème, le fait que le @leCodeArt n'avait pas encore de valeur. Du coup on donne un paramètre NULL donc forcément ça retourne un résultat NULL.

    Je ne savais pas, avant que tu le dises, que le paramètre n'était pas encore 'instancié'. Mais ça parait complètement logique.

    Je me coucherai vraiment moins bête ce soir
    __________________________________________________________________________________________________________________________________

    En ce qui concerne les dates, il n'y a même pas besoin d'utiliser un convert() au final, car peut importe dans quel format et type sont @laDateDeDebut et @laDateDeFin, lors de l'insert, elles vont être transformées en 'AAAA/MM/JJ'.
    __________________________________________________________________________________________________________________________________

    La procédure fonctionne donc correctement pour un article, mais quand j'enlève la clause where, il me met :
    ErrorCode: -2146232060

    [.Net SqlClient Data Provider]
    Number: -2, Class: 11, State: 0, Line: 0
    ErrorMessage: Expiration du Timeout. Le délai d'attente s'est écoulé avant la fin de l'opération ou le serveur ne répond pas.
    InnerException: Dépassement du délai d’attente
    La procédure met + d'une minute à s'exécuter donc le logiciel l'arrête.
    Le problème c'est que je ne vois pas comment optimiser l'exécution.
    J'ai essayé avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE codearticle = codearticle
    Mais c'est toujours aussi long..

  7. #7
    Membre expérimenté
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Billets dans le blog
    4
    Par défaut
    Alors, il faut savoir qu'il est impossible de faire des affectations de valeurs à des variables à partir d'une requête retournant plusieurs lignes.

    Si tu souhaites faire ton test sur un bloc et les envoyer dans ta table. Tu dois impérativement te passer de la boucle.
    D'ailleurs, je te le recommande, les SGBDR sont optimisés pour traiter les informations de manière ensembliste, c'est à dire par bloc de données.

    Peux-tu me dire à quoi correspond le @leNumPromo

    Tu fais une boucle qui va répéter 10 fois la requête. Est-ce pour des tests?

    Si tu souhaites faire toute ta table d'un coup, oublie les valeurs @ et passe directement par un INSERT SELECT.

    Code sql : 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
     
     
    WITH CodeArtNumPromo AS (
    SELECT DISTINCT
           CodeArticle
         , saison
         , ROW_NUMBER() OVER ( ORDER BY CodeArticle ) AS NumPromo
      FROM Article )
     
    INSERT INTO MIM_Demarques
         ( CodeProduit, Saison, DateDebut, DateFin, Prix )
    SELECT CodeArticle
         , saison
         , dbo.MIM_ExtraitDateDebutFR( CodeArticle, NumPromo )
         , dbo.MIM_ExtraitDateDebutFR( CodeArticle, NumPromo )
         , dbo.MIM_ExtraitDateDebutFR( CodeArticle, NumPromo )
       FROM CodeArtNumPromo;

    Afin que tu comprennes, voici l'explication de la requête.

    Dans la fonction WITH (Appelé CTE), je génère pour chaque CodeArticle, un NumPromo "auto-increment" trié par ordre alphabétique (ceci est arbitraire tu peux le changer, en changeant le ORDER BY de la fonction OVER().

    Une fois que la CTE à généré pour chaque code article un NumPromo associé, je me sers du résultat dans une requête qui va exécuter, pour chaque ligne, les fonctions de dates.

    Le tout est inséré dans la table MIM_Demarques.

    J'espère que ça t'aura aidé.

    Cordialement,
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

Discussions similaires

  1. Problème sur variable date [BO 5.1.9]
    Par LOPEZ dans le forum Deski
    Réponses: 6
    Dernier message: 06/06/2014, 08h23
  2. Réponses: 7
    Dernier message: 24/10/2011, 21h49
  3. problèmes variable Date
    Par stargates dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/05/2008, 17h57
  4. PRoblème d'apostrophe dans variable.
    Par jbidou88 dans le forum VBA Access
    Réponses: 2
    Dernier message: 05/06/2007, 14h57
  5. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 16h56

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