IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

SQLpro

Souci suite à la Migration de bases de 2014 vers 2019

Noter ce billet
par , 20/01/2024 à 10h18 (336 Affichages)
Citation Envoyé par ulmeen Voir le message
Bonjour (et bonne année 2024)

Je rencontre un souci suite à la migration de mon serveur SQL de 2014 à 2019

J'ai une fonction scalaire fn_IdentiteNomPrenomCodeCEA qui renvoi une chaine

Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT dbo.fn_IdentiteNomPrenomCodeCEA(CodeUtil) as IdentiteCIInverse
donne ceci sur mon serveur 2014
NOM PRENOM BADGE

Lancée sur mon serveur 2019, j’ai une erreur de requête
Msg 208, Level 16, State 1, Procedure fn_IdentiteNomPrenomCodeCEA, Line 48
Nom d'objet 'Annuaire.dbo.AnnuaireUnifie' non valide.

La fonction regarde sur quel serveur elle est lancée pour choisir la base concernée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
       set @serveur=@@SERVERNAME
       set @Regime=(SELECT Regime FROM ParamServeurAppliSTIC.dbo.ServeursSQL WHERE NomServeur=@@servername)

       if(@Regime='Test') set @Retour= (SELECT Nom+' '+Prenom+' '+CodeCEA FROM TestAnnuaire.dbo.AnnuaireUnifie WHERE ConnectId=@Code)
       else set @Retour= (SELECT Nom+' '+Prenom+' '+CodeCEA FROM Annuaire.dbo.AnnuaireUnifie WHERE ConnectId=@Code)
Ma variable @Regime=Test donc seule la 1° requête est sensée s'exécuter
Mais il semble que la fonction veuille quand même interpréter la requête du else

Ce type de test est très présent dans mes procédures stockées et fonctions diverses. Ce serait un gros souci pour moi si je devais l’abandonner.

Avez-vous une idée ?

Merci
En fait ce qui s'est passé a été prévu par SQL Server...

Depuis la version 2017, Microsoft a beaucoup travaillé sur de nouvelles optimisations dans le cadre d'un projet appelé "Intelligent Query Processor" (IQP), dont l'une des fonctionnalité consiste à supprimer l'appel de la fonction (UDF) en l'intégrant directement dans la requête afin que le tout soit optimisé. Cela s'appelle l'inligning (enlignement)...
En effet, les requêtes ont un comportement ensembliste (toutes les opérations s'effectuent en même temps <=> parallélisme) alors qu'une fonction est toujours itérative (c'est à dire que le code se déroule séquentiellement) ce qui fait que l'introduction de fonctions dans le code d'une requête casse ordinairement le fonctionnement ensembliste de la requête et la rend itérative et par conséquent lente... Pour palier à ce problème de performance Microsoft Research a initié le projet "FROID" a eut pour but de récrire les requêtes en réintégrant le code SQL de la fonction dans la requête. . On obtient alors une requête parfaitement ensembliste et les performances n'ont plus rien à voir....
Cependant, ce mode a un inconvénient : il étudie toutes les possibilités d'exécution simultanément, alors que l'itération dans le code d'une UDF coupe des branches via les commande de contrôle telles que IF THEN ELSE...
Sachant cela, il y a quelques rares cas ou cet "enlignement" de la fonction peut devenir un problème et c'est votre cas... En effet, une requête est compilée d'un seul bloc et l'absence de certains objets à ce moment peut se révéler critique...
Pour palier à cet effet de bord, Microsoft SQL Server a rajouté une option dans la création des fonctions (INLINE = OFF) afin d'interdire l'enlignement d'une UDF au cas ou cela produirait une anomalie...

Vous êtes tombé dessus !

A +

Envoyer le billet « Souci suite à la Migration de bases de 2014 vers 2019 » dans le blog Viadeo Envoyer le billet « Souci suite à la Migration de bases de 2014 vers 2019 » dans le blog Twitter Envoyer le billet « Souci suite à la Migration de bases de 2014 vers 2019 » dans le blog Google Envoyer le billet « Souci suite à la Migration de bases de 2014 vers 2019 » dans le blog Facebook Envoyer le billet « Souci suite à la Migration de bases de 2014 vers 2019 » dans le blog Digg Envoyer le billet « Souci suite à la Migration de bases de 2014 vers 2019 » dans le blog Delicious Envoyer le billet « Souci suite à la Migration de bases de 2014 vers 2019 » dans le blog MySpace Envoyer le billet « Souci suite à la Migration de bases de 2014 vers 2019 » dans le blog Yahoo

Commentaires