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 :

Fonction avec OPENROWSET(BULK)


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 24
    Par défaut Fonction avec OPENROWSET(BULK)
    Bonjour à toutes et tous,

    Je sèche lamentablement sur l'utilisation paramétrée de l'instruction OPENROWSET(BULK ...)

    J'ai des fichiers d'archives que je peux lire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM OPENROWSET(BULK 'D:\200803.bulk', FORMATFILE = 'D:\200803.fmt') AS data
    Pour me simplifier la vie, je souhaitais paramétrer cette lecture d'archives à l'aide d'une fonction que j'imaginais comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ALTER FUNCTION [dbo].[bulkArchive]
      (@idArchive varchar(50))
    RETURNS table
    AS
    RETURN
      SELECT * FROM OPENROWSET(BULK 'D:\' + @idArchive + '.bulk', FORMATFILE = 'D:\' + @idArchive + '.fmt') AS data
    Et que j'aurais pu facilement utiliser dans un SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM dbo.bulkArchive('200803')
    Malheureusement l'utilisation de variables dans OPENROWSET n'est pas permise et donc impossible d'écrire ma fonction.

    La solution serait peut-être d'utiliser du SQL dynamique dans ma fonction mais je ne vois pas comment faire. Est-ce que quelqu'un aurait une idée ?

    D'avance merci pour votre aide.
    Stéphane

  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
    22 001
    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 001
    Billets dans le blog
    6
    Par défaut
    Il faut utiliser du SQL dynamique via une procédures stockée.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE PROCEDURE [dbo].[bulkArchive]  (@idArchive varchar(50))
    AS
    DECLARE @SQL NVARCHAR(max) = N'SELECT * FROM OPENROWSET(BULK ''D:\''' + @idArchive + '.bulk'', FORMATFILE = ''D:\' + @idArchive + '.fmt'') AS data;';
    EXEC (@SQL);
    Une fonction n'a pas le droit d'exécuter du SQL dynamique...

    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
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2008
    Messages : 24
    Par défaut
    Bonjour Frédéric,

    Merci pour la réponse mais j'ai bien peur que cela ne résolve pas vraiment mon problème car sauf erreur il n'est pas possible d'appeler un procstock dans une instruction SELECT et d'écrire quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MaProcstck('200803')
    contrairement à une fonction.

    J'ai bien peur qu'il n'y ait pas de solution, tant pis pour moi ...

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    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 001
    Billets dans le blog
    6
    Par défaut
    Une fonction ne peut en aucun cas faire du dynamique ni écrire

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Réponses: 3
    Dernier message: 05/09/2006, 00h47
  3. Appeler une fonction avec "action" ds un
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 14h54
  4. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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