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 :

Vue et fonction "table" [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Gestionnaire de base de données
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Vue et fonction "table"
    Bonjour,

    voici ma problématique du jour :
    Je voudrais utiliser le résultat d'une fonction Table dans une vue. J'ai cherché un peu partout sans succès.
    Voici mon exemple :

    Fonction F_Split :

    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
    CREATE FUNCTION [dbo].[F_Split]
    (
        @String NVARCHAR(4000),
        @Delimiter NCHAR(1)
    )
    RETURNS TABLE
    AS
    RETURN
    (
        WITH Split(stpos,endpos)
        AS(
            SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
            UNION ALL
            SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
                FROM Split
                WHERE endpos > 0
        )
        SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
            'Recherche' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
        FROM Split
    )
    Utilisation de F_Split seule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM F_Split('169901548,169902514', ',')
    Résultat

    Id Recherche
    1 169901548
    2 169902514
    Utilisation de F_Split liée avec une table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT NoCde, CodeFournisseur 
    FROM Table2
        INNER JOIN dbo.F_Split('169901548,169902514', ',') ON NoCde = F_Split.Recherche
    Résultat

    NoCde CodeFournisseur
    169901548 98003000
    169902514 98008000
    Je voudrais lier ma colonne Recherche avec une table Cde afin de réaliser un rapport dans Crystal Report.
    Peut-être modifier ma fonction pour lister l'ensemble des données de ma table1
    Soit écrire une commande sql dans Crystal, soit créer une vue pour lier d'autres tables

    J'étudie toute proposition.
    D'avance merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Graboubou Voir le message

    Utilisation de F_Split liée avec une table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT NoCde, CodeFournisseur 
    FROM Table2
        INNER JOIN dbo.F_Split('169901548,169902514', ',') ON NoCde = F_Split.Recherche
    Il faut utiliser le principe de l'intra jointure avec APPLY. Dans le cas présent CROSS APPLY (sinon OUTER APPLY)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT NoCde, CodeFournisseur 
    FROM Table2
        CROSS APPLY dbo.F_Split(Table2.MaColonne, ',')  AS F
    WHERE NoCde = F.Recherche
    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/ * * * * *

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Gestionnaire de base de données
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Merci
    Bonjour,

    c'est exactement ce dont j'avais besoin. Merci beaucoup
    Bonne journée

    Graboubou

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Vous risquez de rencontrer des problèmes de performance avec la fonction, parce qu'elle utilise la récursivité.
    Cela convient aux situations où la chaîne que l'on souhaite exploser en un ensemble de valeurs en contient peu, et que le nombre de lignes à traiter est faible.
    Dès que l'un ou l'autre (ou les deux ! ) augmentent, on a affaire à des problèmes. Vous pouvez y pallier en construisant la fonction de table en ligne qui s'appuie sur les requêtes que j'ai données dans ce petit billet.

    @++

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

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