Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

passer une liste à une procédure stockée

5 réponses
Avatar
Thierry
Bonjour,

Je recherche le meilleur moyen de passer une liste de valeurs d'une appli
cliente à une procédure stockée afin d'extraire des données.

J'ai trouvé cette solution en passant les données au format XML:

CREATE PROCEDURE test
@Xml text
AS
DECLARE @hDoc int
EXECUTE sp_xml_preparedocument @hDoc OUTPUT, @Xml
SELECT Customers.*
FROM Customers
JOIN OPENXML(@hDoc, 'VFPData/liste') WITH (id char(5)) liste
ON Customers.CustomerID = liste.id
EXECUTE sp_xml_removedocument @hDoc

Y a t-il un moyen équivalent et au moins aussi performant, mais en utilisant
de simples données textes (avec délimiteurs TAB, CRLF...) ?

--
Thierry

5 réponses

Avatar
Bouarroudj Mohamed
Generalement les gens utilise un delimited text, tu peux utiliser une
fonction (UDF) qui recoit comme param un delimited text et retourne une
table, cette UDF sera utilisé par vos procédure stockée pour parser le text,
sur le net il y'a plusieurs exemples, voici un :
http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm


"Thierry" wrote in message
news:
Bonjour,

Je recherche le meilleur moyen de passer une liste de valeurs d'une appli
cliente à une procédure stockée afin d'extraire des données.

J'ai trouvé cette solution en passant les données au format XML:

CREATE PROCEDURE test
@Xml text
AS
DECLARE @hDoc int
EXECUTE sp_xml_preparedocument @hDoc OUTPUT, @Xml
SELECT Customers.*
FROM Customers
JOIN OPENXML(@hDoc, 'VFPData/liste') WITH (id char(5)) liste
ON Customers.CustomerID = liste.id
EXECUTE sp_xml_removedocument @hDoc

Y a t-il un moyen équivalent et au moins aussi performant, mais en
utilisant de simples données textes (avec délimiteurs TAB, CRLF...) ?

--
Thierry



Avatar
Thierry
Merci pour le lien.

J'ai essayé avec succès une UDF.

Il ne me reste plus qu'à choisir la solution la plus pratique et/ou la plus
performante.


--
Thierry


"Bouarroudj Mohamed" a écrit dans le message de
news:
Generalement les gens utilise un delimited text, tu peux utiliser une
fonction (UDF) qui recoit comme param un delimited text et retourne une
table, cette UDF sera utilisé par vos procédure stockée pour parser le
text, sur le net il y'a plusieurs exemples, voici un :
http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm


"Thierry" wrote in message
news:
Bonjour,

Je recherche le meilleur moyen de passer une liste de valeurs d'une appli
cliente à une procédure stockée afin d'extraire des données.

J'ai trouvé cette solution en passant les données au format XML:

CREATE PROCEDURE test
@Xml text
AS
DECLARE @hDoc int
EXECUTE sp_xml_preparedocument @hDoc OUTPUT, @Xml
SELECT Customers.*
FROM Customers
JOIN OPENXML(@hDoc, 'VFPData/liste') WITH (id char(5)) liste
ON Customers.CustomerID = liste.id
EXECUTE sp_xml_removedocument @hDoc

Y a t-il un moyen équivalent et au moins aussi performant, mais en
utilisant de simples données textes (avec délimiteurs TAB, CRLF...) ?

--
Thierry







Avatar
mark
Fait nous partager vos conclusions, j'aimerai bien savoir quelle methode est
la plus performante ?

Merci

"Thierry" wrote in message
news:
Merci pour le lien.

J'ai essayé avec succès une UDF.

Il ne me reste plus qu'à choisir la solution la plus pratique et/ou la


plus
performante.


--
Thierry


"Bouarroudj Mohamed" a écrit dans le message de
news:
> Generalement les gens utilise un delimited text, tu peux utiliser une
> fonction (UDF) qui recoit comme param un delimited text et retourne une
> table, cette UDF sera utilisé par vos procédure stockée pour parser le
> text, sur le net il y'a plusieurs exemples, voici un :
> http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm
>
>
> "Thierry" wrote in message
> news:
>> Bonjour,
>>
>> Je recherche le meilleur moyen de passer une liste de valeurs d'une


appli
>> cliente à une procédure stockée afin d'extraire des données.
>>
>> J'ai trouvé cette solution en passant les données au format XML:
>>
>> CREATE PROCEDURE test
>> @Xml text
>> AS
>> DECLARE @hDoc int
>> EXECUTE sp_xml_preparedocument @hDoc OUTPUT, @Xml
>> SELECT Customers.*
>> FROM Customers
>> JOIN OPENXML(@hDoc, 'VFPData/liste') WITH (id char(5)) liste
>> ON Customers.CustomerID = liste.id
>> EXECUTE sp_xml_removedocument @hDoc
>>
>> Y a t-il un moyen équivalent et au moins aussi performant, mais en
>> utilisant de simples données textes (avec délimiteurs TAB, CRLF...) ?
>>
>> --
>> Thierry
>>
>
>




Avatar
Pascal
"Thierry" wrote in message
news:
Merci pour le lien.

J'ai essayé avec succès une UDF.

Il ne me reste plus qu'à choisir la solution la plus pratique et/ou la
plus performante.



Pour ma part j'utilise une UDF depuis 2001 pour faire ce genre de boulot, je
trouve plus pratique ET plus performant. Mais je suis ouvert s'il existe une
meilleure solution. Version 2005 ?
Bien que je me demande ce qui peut être plus rapide qu'une bête boucle en
SQL pour ce genre de requête.


Pascal
Avatar
Thierry
Bonjour,

Avec un test portant sur 800 valeurs à envoyées à Sql Server, la solution
d'une UDF est 2 fois plus performante que le OpenXml().
(environ 0.2s contre 0.4s)

Simple requête du style :

Select count(*)
from Lignes
join Split_n_contrat(?) liste on Lignes.n_contrat =liste.n_contrat

Avec des jointures plus compliqués, la différence de performance n'est pas
perceptible.

Reste un avantage du XML, c'est qu'à la fois coté client (Visual Foxpro) ou
Serveur, je n'est pas à écrire de fonction spécifique pour faire la
transformation des données (table<-->chaîne XML), elles existent déjà en
standard.

Il reste un problème éventuel avec l'UDF.
Varchar est limité à 8000 caractères (mais ça devrait me suffire), et on ne
peut pas utiliser d'arguments de type Text dans des fonctions comme ltrim()
ou replace().

--
Thierry


"mark" a écrit dans le message de news:

Fait nous partager vos conclusions, j'aimerai bien savoir quelle methode
est
la plus performante ?

Merci

"Thierry" wrote in message
news:
Merci pour le lien.

J'ai essayé avec succès une UDF.

Il ne me reste plus qu'à choisir la solution la plus pratique et/ou la


plus
performante.


--
Thierry


"Bouarroudj Mohamed" a écrit dans le message de
news:
> Generalement les gens utilise un delimited text, tu peux utiliser une
> fonction (UDF) qui recoit comme param un delimited text et retourne une
> table, cette UDF sera utilisé par vos procédure stockée pour parser le
> text, sur le net il y'a plusieurs exemples, voici un :
> http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm
>
>
> "Thierry" wrote in message
> news:
>> Bonjour,
>>
>> Je recherche le meilleur moyen de passer une liste de valeurs d'une


appli
>> cliente à une procédure stockée afin d'extraire des données.
>>
>> J'ai trouvé cette solution en passant les données au format XML:
>>
>> CREATE PROCEDURE test
>> @Xml text
>> AS
>> DECLARE @hDoc int
>> EXECUTE sp_xml_preparedocument @hDoc OUTPUT, @Xml
>> SELECT Customers.*
>> FROM Customers
>> JOIN OPENXML(@hDoc, 'VFPData/liste') WITH (id char(5)) liste
>> ON Customers.CustomerID = liste.id
>> EXECUTE sp_xml_removedocument @hDoc
>>
>> Y a t-il un moyen équivalent et au moins aussi performant, mais en
>> utilisant de simples données textes (avec délimiteurs TAB, CRLF...) ?
>>
>> --
>> Thierry
>>
>
>