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

MS SQL Server Discussion :

Fonction sous SQL Server


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 23
    Points : 7
    Points
    7
    Par défaut Fonction sous SQL Server
    l'o 'll coder, 2 question :

    J'ai codé une fonction qui est censée me renvoyer une chaine de caractère (maximum 8000 caractères)

    Question 1 :
    Cependant je remarque qu'il y 'a une limite , en effet le contenu de retour ne dépasse pas 1024 Octets, donc comment palier à ce problème?

    Question 2 :
    La solution que je propose n'est peut etre pas optimum, il vaut peut etre mieux stocker mes valeurs dans une table temporaire, mais comment la déclarer?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DECLARE #MyTable Table(id int, value char(10)
    Apparement ca ne fonctionne pas!

    Voici ma fonction :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    CREATE FUNCTION dbo.OpenAgendaBis
    (
    @DateDebut datetime,
    @DateFin datetime,
    @Intervenant Varchar(50)
    )
    RETURNS char(8000)
    AS
    	BEGIN
    		DECLARE @Ret char(8000);
     
    		DECLARE Cur CURSOR FOR
    SELECT     DetailAgenda.[Date], DetailAgenda.NoRDV, Agenda.NoTypeRDV, Agenda.Annotation, Agenda.Ville, Agenda.Client, Agenda.NoCli, Client.NomSociété
    		FROM         DetailAgenda INNER JOIN
    		                      DetailAgendaHeure ON DetailAgenda.NoDetailAgenda = DetailAgendaHeure.NoDetailAgendaDate INNER JOIN
    		                      Agenda ON DetailAgenda.NoRDV = Agenda.NoRDV INNER JOIN
    		                      DetailRDVIntervenant ON Agenda.NoRDV = DetailRDVIntervenant.NoRDV INNER JOIN
    			         Client ON Agenda.NoCli = Client.NoCli
    		WHERE     (DetailAgenda.[Date] BETWEEN  @DateDebut   AND   @DateFin ) AND (DetailRDVIntervenant.NoIntervenant IN (SELECT * FROM dbo.udf_Txt_SplitTAB(@Intervenant,',')))
    		GROUP BY DetailAgenda.NoRDV, DetailAgenda.[Date], Agenda.NoTypeRDV, Agenda.Annotation, Agenda.Ville, Agenda.Client, Agenda.NoCli, Client.NomSociété
     
    		DECLARE @Date DateTime;
    		DECLARE @NoRDV int;
    		DECLARE @NoTypeRDV int;
    		DECLARE @Annotation char(128);
    		DECLARE @Ville char(30);
    		DECLARE @Client char(30);
    		DECLARE @NoCli int;
    		DECLARE @NomSociete char(30);
    		DECLARE @NoInter as int;
    		DECLARE @MinHeure char(30);
    		DECLARE @MaxHeure char(30);
    		DECLARE @Heure char(30);
    		Set @Ret=""
     
    		OPEN Cur
    		FETCH NEXT FROM Cur INTO @Date,@NoRDV,@NoTypeRDV,@Annotation,@Ville,@Client,@NoCli, @NomSociete
    		WHILE (@@FETCH_STATUS = 0) 
    			BEGIN
    --				SET @Annotation=""
    --				SET @Ville=""
    if @Ville is null
    	set @Ville=""
     
    if @Annotation is null
    	set @Annotation=""
     
     
    				SET @Ret=@Ret + CONVERT(Varchar(10), @Date,103) + "|" + RTRIM(CAST(@NoRDV AS Char(10))) + "|" + RTRIM(CAST(@NoTypeRDV AS Char(10))) + "|" + RTRIM(@Annotation) + "|" + RTRIM(@Ville) + "|" + RTRIM(CAST(@NoCli AS Char(10))) + "|" +  RTRIM(@NomSociete) + "["
     
    				DECLARE CurInter CURSOR FOR SELECT NoIntervenant FROM DetailRDVIntervenant WHERE DetailRDVIntervenant.NoRDV=@NoRDV
    				OPEN CurInter
    				FETCH NEXT FROM CurInter Into @NoInter
    				WHILE (@@FETCH_STATUS = 0) 
    					BEGIN
    						SET @Ret = @Ret + RTRIM(CAST(@NoInter AS Char(10))) + "|"
    						FETCH NEXT FROM CurInter Into @NoInter
    					END
    				CLOSE CurInter
    				DEALLOCATE CurInter
    				SET @Ret = @Ret + "["
     
    --				SELECT @MinHeure=MIN(Heure) , @MaxHeure=MAX(Heure) FROM DetailAgendaHeure, DetailAgenda WHERE NoDetailAgendaDate=DetailAgenda.NoDetailAgenda AND DetailAgenda.NoRDV=@NoRDV
    				DECLARE CurHeure CURSOR FOR SELECT Heure FROM DetailAgendaHeure, DetailAgenda WHERE NoDetailAgendaDate=DetailAgenda.NoDetailAgenda AND DetailAgenda.NoRDV=@NoRDV ORDER BY Heure
    				OPEN CurHeure
    				FETCH NEXT FROM CurHeure Into @Heure
    				WHILE (@@FETCH_STATUS = 0) 
    					BEGIN
    						SET @Ret = @Ret + RTRIM(@Heure) + "|"
    						FETCH NEXT FROM CurHeure Into @Heure
    					END
    				CLOSE CurHeure
    				DEALLOCATE CurHeure
     
    --				SET @Ret = @Ret +"[" + RTRIM(@MinHeure) + "|" + RTRIM(@MaxHeure) + "{"
    				SET @Ret = @Ret + "{"
     
    				FETCH NEXT FROM Cur INTO @Date,@NoRDV,@NoTypeRDV,@Annotation,@Ville,@Client,@NoCli, @NomSociete
    			END
    		CLOSE Cur
    		DEALLOCATE Cur;
     
    RETURN (@Ret)
    END
    @Intervenant est une chaine du genre "141" ou "141,143"
    udf_Txt_SplitTAB est une fonction permettant de splitter une chaine dans un tableau

    Voila si vous avez des idées pour améliorer ce code ou des réponses à mes question, je suis tout ouïe

    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    Hormis les tests sur Ville et Annotation qui pourraient avantageusement être remplacés par des COALESCE au niveau du curseur, il s'agit visiblement là d'une mise en ligne de plusieurs données, ce qui freine la non utilisation des curseurs.

    La question à se poser est de savoir pourquoi ceci est fait au niveau du T-SQL et pas de l'applicatif client.
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    La premiere version était côté client, mais malheureusement le traitement est trop long donc j'ai opté pour ce type de solution, apparement ca à l'air plus rapide, mais ma chaine de retour est incomplete!

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    En effet le code côté client (dans une application en VB) est beaucoup moins rapide, je viens tout juste de retester cette solution

    Cependant, j'aitrouvé d'où venait la limitation de 1024 octets, c'était simplement une limite de l'objet command relié à l'UDF, il suffit maintenant de modifer la valeurs à 4000 (théoriquement ma chaine ne devrait pas excéder 4000). Donc la solution marche bien, en ce qui concerne tes conseil pour COALESCE, je tient compte de suite

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/09/2009, 10h45
  2. Equivalent de rownum sous SQL server
    Par Isildur dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 27/07/2009, 15h48
  3. fonction de recherche par mot clé sous SQL SERVER 2005
    Par solawe dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/07/2007, 19h31
  4. Réponses: 1
    Dernier message: 13/12/2006, 14h18
  5. MAJ d'une table sous SQL Server par insertion
    Par keish dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/06/2003, 16h23

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