BULK INSERT : Droits nécessaires pour l'utilisation
6 réponses
Jean-Yves
Contexte :
Depuis mon soft, je voudrais créer une table temporaire à partir de
résultats de recherches et d'autres critères/filtres.
J'utilise pour l'instant une série de INSERT INTO ... VALUES, mais
c'est très gourmand en temps dès qu'il y a beaucoup d'enr. à ajouter
(plusieurs milliers).
Essais :
Je pensais créer un fichier .TXT (beaucoup + rapide) et ensuite utiliser
BULK INSERT pour insérer tous les enr. dans ma table temporaire.
Mais j'ai fait quelques tests et il semblerait qu'il faille disposer de
certains droits :
- L'utilisateur de mon soft doit avoir le rôle Bulk Insert
Administrators sur le serveur.
- Le service SQL qui lance le Serveur SQL doit avoir les droits d'accès
sur le répertoire réseau où je crée mon fichier .TXT.
Ces deux contraintes me paraissent insurmontables pour pouvoir mettre en
place cette solution chez tous mes clients.
Y a-t-il quelque chose qui m'échappe ou existe-t-il une autre/meilleure
solution ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Thierry
Bonjour,
La solution que j'ai adopté dans pareil situation est de passer les données à une procédure stockée sur forme de texte délimité ou de XML.
Voir cette discussion à ce sujet : http://groups.google.fr/group/microsoft.public.fr.sqlserver/browse_frm/thread/d5bf0119a2dfab48/78eb55dc7da28b0a
-- Thierry
"Jean-Yves" a écrit dans le message de news: dlffq4$ulf$
Contexte : Depuis mon soft, je voudrais créer une table temporaire à partir de résultats de recherches et d'autres critères/filtres. J'utilise pour l'instant une série de INSERT INTO ... VALUES, mais c'est très gourmand en temps dès qu'il y a beaucoup d'enr. à ajouter (plusieurs milliers).
Essais : Je pensais créer un fichier .TXT (beaucoup + rapide) et ensuite utiliser BULK INSERT pour insérer tous les enr. dans ma table temporaire. Mais j'ai fait quelques tests et il semblerait qu'il faille disposer de certains droits :
- L'utilisateur de mon soft doit avoir le rôle Bulk Insert Administrators sur le serveur. - Le service SQL qui lance le Serveur SQL doit avoir les droits d'accès sur le répertoire réseau où je crée mon fichier .TXT.
Ces deux contraintes me paraissent insurmontables pour pouvoir mettre en place cette solution chez tous mes clients.
Y a-t-il quelque chose qui m'échappe ou existe-t-il une autre/meilleure solution ?
Bonjour,
La solution que j'ai adopté dans pareil situation est de passer les données
à une procédure stockée sur forme de texte délimité ou de XML.
Voir cette discussion à ce sujet :
http://groups.google.fr/group/microsoft.public.fr.sqlserver/browse_frm/thread/d5bf0119a2dfab48/78eb55dc7da28b0a
--
Thierry
"Jean-Yves" <NoName@sorry.fr> a écrit dans le message de news:
dlffq4$ulf$1@s1.news.oleane.net...
Contexte :
Depuis mon soft, je voudrais créer une table temporaire à partir de
résultats de recherches et d'autres critères/filtres.
J'utilise pour l'instant une série de INSERT INTO ... VALUES, mais c'est
très gourmand en temps dès qu'il y a beaucoup d'enr. à ajouter (plusieurs
milliers).
Essais :
Je pensais créer un fichier .TXT (beaucoup + rapide) et ensuite utiliser
BULK INSERT pour insérer tous les enr. dans ma table temporaire.
Mais j'ai fait quelques tests et il semblerait qu'il faille disposer de
certains droits :
- L'utilisateur de mon soft doit avoir le rôle Bulk Insert Administrators
sur le serveur.
- Le service SQL qui lance le Serveur SQL doit avoir les droits d'accès
sur le répertoire réseau où je crée mon fichier .TXT.
Ces deux contraintes me paraissent insurmontables pour pouvoir mettre en
place cette solution chez tous mes clients.
Y a-t-il quelque chose qui m'échappe ou existe-t-il une autre/meilleure
solution ?
La solution que j'ai adopté dans pareil situation est de passer les données à une procédure stockée sur forme de texte délimité ou de XML.
Voir cette discussion à ce sujet : http://groups.google.fr/group/microsoft.public.fr.sqlserver/browse_frm/thread/d5bf0119a2dfab48/78eb55dc7da28b0a
-- Thierry
"Jean-Yves" a écrit dans le message de news: dlffq4$ulf$
Contexte : Depuis mon soft, je voudrais créer une table temporaire à partir de résultats de recherches et d'autres critères/filtres. J'utilise pour l'instant une série de INSERT INTO ... VALUES, mais c'est très gourmand en temps dès qu'il y a beaucoup d'enr. à ajouter (plusieurs milliers).
Essais : Je pensais créer un fichier .TXT (beaucoup + rapide) et ensuite utiliser BULK INSERT pour insérer tous les enr. dans ma table temporaire. Mais j'ai fait quelques tests et il semblerait qu'il faille disposer de certains droits :
- L'utilisateur de mon soft doit avoir le rôle Bulk Insert Administrators sur le serveur. - Le service SQL qui lance le Serveur SQL doit avoir les droits d'accès sur le répertoire réseau où je crée mon fichier .TXT.
Ces deux contraintes me paraissent insurmontables pour pouvoir mettre en place cette solution chez tous mes clients.
Y a-t-il quelque chose qui m'échappe ou existe-t-il une autre/meilleure solution ?
Jean-Yves
Thierry,
Très grand merci pour tes conseils.
J'ai fait quelques tests à ce sujet. Bon d'abord, ça marche et les problèmes de droits d'utilisateur et du serveur SQL sont résolus.
Pour ce qui est de la rapidité, qui est le but premier pour lequel j'essaie de trouver une alternative à ma boucle de INSERT INTO ... VALUES ... c'est pas tellement flagrant je trouve.
C'est environ 3 fois plus rapide (c'est déjà très très bien) mais bon j'espérais mieux :-)
J'ai fait quelques tests en modifiant la longueur de la liste de valeurs (500, 1000, 5000 ou 8000 caractères), les résultats sont assez comparables.
Je n'ai pas vu non plus de différences notoires de performance entre les utilisations 1 (Dynamic SQL) et 5 (Using a general purpose User Defined Function (UDF) to parse the comma separated OrderIDs) décrites dans le très bon papier http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm
Je suis passé à côté d'une évidence ?
Jean-Yves
Thierry,
Très grand merci pour tes conseils.
J'ai fait quelques tests à ce sujet.
Bon d'abord, ça marche et les problèmes de droits d'utilisateur et du
serveur SQL sont résolus.
Pour ce qui est de la rapidité, qui est le but premier pour lequel
j'essaie de trouver une alternative à ma boucle de
INSERT INTO ... VALUES ... c'est pas tellement flagrant je trouve.
C'est environ 3 fois plus rapide (c'est déjà très très bien) mais bon
j'espérais mieux :-)
J'ai fait quelques tests en modifiant la longueur de la liste de valeurs
(500, 1000, 5000 ou 8000 caractères), les résultats sont assez
comparables.
Je n'ai pas vu non plus de différences notoires de performance entre les
utilisations 1 (Dynamic SQL) et 5 (Using a general purpose User Defined
Function (UDF) to parse the comma separated OrderIDs) décrites dans le
très bon papier
http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm
J'ai fait quelques tests à ce sujet. Bon d'abord, ça marche et les problèmes de droits d'utilisateur et du serveur SQL sont résolus.
Pour ce qui est de la rapidité, qui est le but premier pour lequel j'essaie de trouver une alternative à ma boucle de INSERT INTO ... VALUES ... c'est pas tellement flagrant je trouve.
C'est environ 3 fois plus rapide (c'est déjà très très bien) mais bon j'espérais mieux :-)
J'ai fait quelques tests en modifiant la longueur de la liste de valeurs (500, 1000, 5000 ou 8000 caractères), les résultats sont assez comparables.
Je n'ai pas vu non plus de différences notoires de performance entre les utilisations 1 (Dynamic SQL) et 5 (Using a general purpose User Defined Function (UDF) to parse the comma separated OrderIDs) décrites dans le très bon papier http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm
Je suis passé à côté d'une évidence ?
Jean-Yves
Thierry
Voici une autre étude sur la question : http://www.sommarskog.se/arrays-in-sql.html
-- Thierry
"Jean-Yves" a écrit dans le message de news: dli9t6$eih$
Thierry,
Très grand merci pour tes conseils.
J'ai fait quelques tests à ce sujet. Bon d'abord, ça marche et les problèmes de droits d'utilisateur et du serveur SQL sont résolus.
Pour ce qui est de la rapidité, qui est le but premier pour lequel j'essaie de trouver une alternative à ma boucle de INSERT INTO ... VALUES ... c'est pas tellement flagrant je trouve.
C'est environ 3 fois plus rapide (c'est déjà très très bien) mais bon j'espérais mieux :-)
J'ai fait quelques tests en modifiant la longueur de la liste de valeurs (500, 1000, 5000 ou 8000 caractères), les résultats sont assez comparables.
Je n'ai pas vu non plus de différences notoires de performance entre les utilisations 1 (Dynamic SQL) et 5 (Using a general purpose User Defined Function (UDF) to parse the comma separated OrderIDs) décrites dans le très bon papier http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm
Je suis passé à côté d'une évidence ?
Jean-Yves
Voici une autre étude sur la question :
http://www.sommarskog.se/arrays-in-sql.html
--
Thierry
"Jean-Yves" <NoName@sorry.fr> a écrit dans le message de news:
dli9t6$eih$1@s1.news.oleane.net...
Thierry,
Très grand merci pour tes conseils.
J'ai fait quelques tests à ce sujet.
Bon d'abord, ça marche et les problèmes de droits d'utilisateur et du
serveur SQL sont résolus.
Pour ce qui est de la rapidité, qui est le but premier pour lequel
j'essaie de trouver une alternative à ma boucle de
INSERT INTO ... VALUES ... c'est pas tellement flagrant je trouve.
C'est environ 3 fois plus rapide (c'est déjà très très bien) mais bon
j'espérais mieux :-)
J'ai fait quelques tests en modifiant la longueur de la liste de valeurs
(500, 1000, 5000 ou 8000 caractères), les résultats sont assez
comparables.
Je n'ai pas vu non plus de différences notoires de performance entre les
utilisations 1 (Dynamic SQL) et 5 (Using a general purpose User Defined
Function (UDF) to parse the comma separated OrderIDs) décrites dans le
très bon papier
http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm
Voici une autre étude sur la question : http://www.sommarskog.se/arrays-in-sql.html
-- Thierry
"Jean-Yves" a écrit dans le message de news: dli9t6$eih$
Thierry,
Très grand merci pour tes conseils.
J'ai fait quelques tests à ce sujet. Bon d'abord, ça marche et les problèmes de droits d'utilisateur et du serveur SQL sont résolus.
Pour ce qui est de la rapidité, qui est le but premier pour lequel j'essaie de trouver une alternative à ma boucle de INSERT INTO ... VALUES ... c'est pas tellement flagrant je trouve.
C'est environ 3 fois plus rapide (c'est déjà très très bien) mais bon j'espérais mieux :-)
J'ai fait quelques tests en modifiant la longueur de la liste de valeurs (500, 1000, 5000 ou 8000 caractères), les résultats sont assez comparables.
Je n'ai pas vu non plus de différences notoires de performance entre les utilisations 1 (Dynamic SQL) et 5 (Using a general purpose User Defined Function (UDF) to parse the comma separated OrderIDs) décrites dans le très bon papier http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm
Je suis passé à côté d'une évidence ?
Jean-Yves
Jean-Yves
Thierry,
Merci pour ces liens judicieux. J'ai mis quelques temps à assimiler et à tester dans mon programme.
Au final (pour l'instant en tout cas), j'ai utilisé la méthode (http://www.sommarskog.se/arrays-in-sql.html#tblnum) qui, à partir d'une table de nombres, crée une table en ligne (online table) en fonction de la liste des items et ensuite à partir de cette table en ligne je fais une jointure pour obtenir le résultat escompté.
Les performances sont bien meilleures !
Jean-Yves
Thierry,
Merci pour ces liens judicieux. J'ai mis quelques temps à assimiler et à
tester dans mon programme.
Au final (pour l'instant en tout cas), j'ai utilisé la méthode
(http://www.sommarskog.se/arrays-in-sql.html#tblnum) qui, à partir d'une
table de nombres, crée une table en ligne (online table) en fonction de
la liste des items et ensuite à partir de cette table en ligne je fais
une jointure pour obtenir le résultat escompté.
Merci pour ces liens judicieux. J'ai mis quelques temps à assimiler et à tester dans mon programme.
Au final (pour l'instant en tout cas), j'ai utilisé la méthode (http://www.sommarskog.se/arrays-in-sql.html#tblnum) qui, à partir d'une table de nombres, crée une table en ligne (online table) en fonction de la liste des items et ensuite à partir de cette table en ligne je fais une jointure pour obtenir le résultat escompté.
Les performances sont bien meilleures !
Jean-Yves
Thierry
Je confirme, cette technique est toujours performante. (encore d'avantage avec des données de longueurs fixes, sans délimiteurs )
-- Thierry
"Jean-Yves" a écrit dans le message de news: dluo3k$bbq$
Thierry,
Merci pour ces liens judicieux. J'ai mis quelques temps à assimiler et à tester dans mon programme.
Au final (pour l'instant en tout cas), j'ai utilisé la méthode (http://www.sommarskog.se/arrays-in-sql.html#tblnum) qui, à partir d'une table de nombres, crée une table en ligne (online table) en fonction de la liste des items et ensuite à partir de cette table en ligne je fais une jointure pour obtenir le résultat escompté.
Les performances sont bien meilleures !
Jean-Yves
Je confirme, cette technique est toujours performante. (encore d'avantage
avec des données de longueurs fixes, sans délimiteurs )
--
Thierry
"Jean-Yves" <NoName@sorry.fr> a écrit dans le message de news:
dluo3k$bbq$1@s1.news.oleane.net...
Thierry,
Merci pour ces liens judicieux. J'ai mis quelques temps à assimiler et à
tester dans mon programme.
Au final (pour l'instant en tout cas), j'ai utilisé la méthode
(http://www.sommarskog.se/arrays-in-sql.html#tblnum) qui, à partir d'une
table de nombres, crée une table en ligne (online table) en fonction de la
liste des items et ensuite à partir de cette table en ligne je fais une
jointure pour obtenir le résultat escompté.
Je confirme, cette technique est toujours performante. (encore d'avantage avec des données de longueurs fixes, sans délimiteurs )
-- Thierry
"Jean-Yves" a écrit dans le message de news: dluo3k$bbq$
Thierry,
Merci pour ces liens judicieux. J'ai mis quelques temps à assimiler et à tester dans mon programme.
Au final (pour l'instant en tout cas), j'ai utilisé la méthode (http://www.sommarskog.se/arrays-in-sql.html#tblnum) qui, à partir d'une table de nombres, crée une table en ligne (online table) en fonction de la liste des items et ensuite à partir de cette table en ligne je fais une jointure pour obtenir le résultat escompté.
Les performances sont bien meilleures !
Jean-Yves
Jean-Yves
Oui j'ai bien vu que c'était plus rapide sans délimiteur, mais surtout pour les très longues listes, ce qui n'est pas vraiment mon cas pour l'instant. Pour les listes "moyennes" les différences de performance sont négligeables d'après ce que j'ai compris.
Jean-Yves
Oui j'ai bien vu que c'était plus rapide sans délimiteur, mais surtout
pour les très longues listes, ce qui n'est pas vraiment mon cas pour
l'instant.
Pour les listes "moyennes" les différences de performance sont
négligeables d'après ce que j'ai compris.
Oui j'ai bien vu que c'était plus rapide sans délimiteur, mais surtout pour les très longues listes, ce qui n'est pas vraiment mon cas pour l'instant. Pour les listes "moyennes" les différences de performance sont négligeables d'après ce que j'ai compris.