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 type de données dans requête récursive


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    automatisme
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : automatisme

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Par défaut Problème type de données dans requête récursive
    Bonjour à tous,

    Je suis bloqué sur cette requête récursive. A chaque exécution. L'erreur suivante m'est renvoyée:
    Msg*240, Niveau*16, État*1, Procédure*Act_PathFinder3, Ligne*148
    Les types ne correspondent pas entre la partie d'ancrage et la partie récursive dans la colonne "j_Way" de la requête récursive "journey".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create table   #Temp_Def_Section_Runtime 
    (			
    	 [Source]		varchar(max)
    	,[Destination]	varchar(max)
    	,[Type_ID]		int
    	,[Groupe01]		varchar(100)
    	,[Groupe02]		varchar(100)
    )
    ...

    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
    ;WITH
    journey (j_Dest, j_Step, j_Type_ID, j_Way) 
    AS
    (
    	SELECT DISTINCT 
    			Source
    			,0
    			,0
    			,cast (@Source  as varchar(max)) 
        FROM	#Temp_Def_Section_Runtime
        WHERE	Source = @Source
     
        UNION  ALL 
     
        SELECT	destination
    			,departure.j_Step + 1
    			,Type_ID
    			,cast(departure.j_Way +','+ cast(arrival.Destination as varchar(max))  as varchar(max))    
     
    	FROM   #Temp_Def_Section_Runtime AS arrival
               inner JOIN journey AS departure
                     ON departure.j_Dest = arrival.Source

    Je comprend bien que le problème vient d'une différence de format entre l'ancrage et la récursivité sur la colonne j_way mais je ne vois pas pourquoi...
    J'ai essayé de nombreuses et différentes façons de poser le CAST as varchar mais le résultat est toujours le même.

    Si j'utilise une table 'physique' à la place de la table temporaire précédemment décrite, cela fonctionne. A n'y rien comprendre !!!

    Merci d'avance pour votre aide.

    COrdialement

  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
    Par défaut
    Bonjour,

    Votre requête est correcte, et je pense qu'il s'agit plus d'un problème de parsing, car votre table temporaire existe. Lorsque vous faites une modification, pensez a supprimer la table temporaire avant de exécuter votre code complet, sinon SQL Server parse la commande en fonction de "l'ancienne" structure de votre table temporaire...

    Ceci expliquerait aussi pourquoi ça fonctionne avec une autre table

  3. #3
    Membre à l'essai
    Homme Profil pro
    automatisme
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : automatisme

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Par défaut
    Merci pour votre réponse

    A la fin de la procédure stockée, je fais un drop de la table temporaire et un create au début. Si la table était toujours existante au moment du create, j'aurai due avoir une erreur.
    Cela signifie que la table est bien inexistante au lancement de la procédure.

  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
    Par défaut
    Comme vous ne supprimez la table qu'a la fin de la procédure, si votre code plante sur la requête, la table est créée, mais pas supprimée (code interrompu)

    Du coup, vous corrigez votre script, et vous relancez. A ce moment là, SQL Server analyse votre script (avant de commencer à exécuter).
    Il valide la syntaxe de CREATE TABLE temporaire (il ne vérifie pas l’existence d'une table ayant le même nom lors du parsing, vous aurez l'erreur à l’exécution)
    Puis il parse voter requête récursive... en se basant sur la table temporaire existante (crée lors de l’exécution précédente, avec possiblement une structure différente...)

    Avez vous testé le DROP TABLE (ou même tout simplement de changer le nom de votre table temporaire). ?

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Vous ne devez pas recaster dans cette partie :

    cast(departure.j_Way +','+ cast(arrival.Destination AS varchar(max)) AS varchar(max))

    Laissez faire sans les fonctions CAST.

    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/ * * * * *

  6. #6
    Membre à l'essai
    Homme Profil pro
    automatisme
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : automatisme

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Vous ne devez pas recaster dans cette partie :

    cast(departure.j_Way +','+ cast(arrival.Destination AS varchar(max)) AS varchar(max))

    Laissez faire sans les fonctions CAST.

    A +
    J'ai essayé les syntaxes suivantes pour la partie récursive:

    ,departure.j_Way +','+ arrival.Destination

    ,departure.j_Way +','+ cast (arrival.Destination as varchar(max))

    ,cast ( departure.j_Way +','+ arrival.Destination as varchar(max))

    Et toujours la même erreur...

  7. #7
    Membre à l'essai
    Homme Profil pro
    automatisme
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : automatisme

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Par défaut
    J'ai changer le nom de table temporaire -> même probleme

    J'ai rajouter en début de procédure l'instruction pour vérifier l’existence ou pas de la table temporaire -> même probleme

    IF object_id('#Temp_Def_Section_Runtime') is not null
    drop table #Temp_Def_Section_Runtime



    D'autre part,en analysant le code, il semble que l'erreur de type vienne du membre arrival.Destination dans la partie récursive de la requète

  8. #8
    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
    Par défaut
    Citation Envoyé par patlepirate Voir le message
    J'ai rajouter en début de procédure l'instruction pour vérifier l’existence ou pas de la table temporaire -> même probleme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IF object_id('#Temp_Def_Section_Runtime') is not null
        drop table #Temp_Def_Section_Runtime
    Ce code ne supprimera pas la table temporaire : elle se trouve dans tempDB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if object_id('tempdb..#Temp_Def_Section_Runtime') IS NOT NULL drop table #Temp_Def_Section_Runtime
    Mais avant de relancer, sélectionnez juste la partie de code drop table #Temp_Def_Section_Runtime et exécutez (la table temporaire ne doit pas exister au moment où vous lancez l’exécution du script complet)

    Pourriez-vous poster votre code complet ?
    Il y a peut-être quelque chose ailleurs...

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/02/2012, 15h36
  2. Réponses: 6
    Dernier message: 15/02/2006, 14h02
  3. Réponses: 3
    Dernier message: 07/02/2006, 13h26
  4. Problème: condition sur formulaire dans requête
    Par decour dans le forum Access
    Réponses: 1
    Dernier message: 17/10/2005, 23h27
  5. Vérification du type de données dans une procédure stockée
    Par biroule dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/09/2004, 11h20

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