Bonjour à tous,

J'aurais besoin de vos lumières...

Dans le cadre d'une application développée en VB.NET avec VS2010, j'exécute je fais appel à une table-valued function don voici le script :

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
37
38
39
40
41
42
43
44
45
USE [LeNomDeLaDB]
GO
/****** Object:  UserDefinedFunction [UserManagement].[FN_GET_USERLIST_BY_NAME]    Script Date: 09/08/2011 12:07:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE FUNCTION [UserManagement].[FN_GET_USERLIST_BY_NAME] 
(	
	-- Add the parameters for the function here
	@name varchar(50), 
	@shop char(3)
)
RETURNS TABLE 
AS
RETURN 
(
	-- Add the SELECT statement with parameter references here
	with 
T1 (firstname, lastname, username, registre)
as 
( 
select upper(firstname) as 'firstname', upper(lastname) as 'lastname', upper(username) as 'username', registre_national as 'registre'
from UserManagement.Users 
where lastname like '%'+ @name +'%' and shop = @shop
),
 
T2 (firstname, lastname, username, registre)
as
(
select upper(prenom_travailleur) as 'firstname', upper(nom_travailleur) as 'lastname', registre_national as 'username', registre_national as 'registre'
from HumanRessources.Personnel
where nom_travailleur like '%'+ @name +'%' and niveau3 = @shop
)
 
select * from T1 
union 
select * from T2 where registre not in (select registre from T1)
 
)
Une explication au sujet de la table T2 et de la clause select où on peut lire "registre_national as 'username'".
Cette requête s'effectue sur une table du schéma dédié aux ressources humaines et cette table ne contient l'information username. Etant donné que je fais une union dans la requête qui sert de résultat à la fonction, j'attribue le numéro de registre national à cette colonne.
Une fois le résultat de la fonction obtenu, si j'ai une valeur numérique dans la colonne username, cela me permet de savoir que l'utilisateur en question n'as pas encore de profil au niveau du usermanagement.

Bref, à priori, cette fonction fonctionne très bien. Du moins, elle a toujours très fonctionné jusqu'ici.

Voici donc, en résumé (je vous fait grâce du code VB.NET), la requête exécutée et qui me pose problème:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
select firstname, lastname, username from usermanagement.fn_get_userlist_by_name('baele','929') order by lastname;
Ici, pour la chaîne recherchée (qui ne correspond ici qu'à un seul utilisateur), la fonction exécutée dans management studio me retourne bien le résultat attendu (cad prénom, nom et username) mais dans visual studio, j'obtiens le numéro de registre national à la place du username. Ce qui provoque une erreur dans l'application car cela est sensé signifier qu'il faut créer un profil dans le usermanagement pour l'utilisateur en question alors que ce n'est absolument pas le cas.

PIRE ! Si la chaîne recherchée est 'geo' (qui correspond également à un seul utilisateur, à savoir moi-même), les résultats dans MS et dans VS sont identiques et corrects.

Auriez-vous une idée de ce qui pourrait causer un tel comportement ?
J'ai bien sûr déjà vérifier les données contenues dans les tables qui sont requêtées (ça se dit ça?) et je n'ai rien trouvé d'anormal.

Evidemment, n'ayant jamais rencontré un tel comportement, j'ignore si le problème se situe au niveau sql (une erreur dans la fonction) ou au niveau programmation.

Toute suggestion est bonne à prendre !

Merci d'avance,

Griftou.