OVH Cloud OVH Cloud

Appel d'une Stored procedure dans une view

17 réponses
Avatar
ILyasse
Bonjour,

J'amerai savoir si elle est possible de faire appelle à une stored procedure
a partir d'nue view.
J'utilise Sql server 2000. Sachant que la stored procedure rempli une table
et à la fin fait un select de cette table. Je voudrai faire une view qui me
renvoie le résultat de ce select.

Merci d'avance pour votre aide.

7 réponses

1 2
Avatar
SQLpro [MVP]
ILyasse a écrit :
Ok j'ai trouvé, mais le problème c'est que ma SP utilise des table
temporaire, chose qu'on ne peut pas faire dans une vue ou une fonction...
Alors que faire...?



mais si !!!!
Lisez l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L3.2


Après vous pouvez faire par exemple :

SELECT *
FROM dbo.MaFonction(...)

A +



"bruno reiter" a écrit :

select ... from UDF_xxx where ...

br


"ILyasse" a écrit dans le message de
news:
Mais alors comment appellé cette fonction dans la vue.
SELECT my_function from quoi ?... C'est ce que je ne comprend pas très
bien
...

"bruno reiter" a écrit :

non, la fonction ne pourra pas appeler la SP, mais la fonction peut faire
exactement ce que fait la SP

br

"ILyasse" a écrit dans le message de
news:
Ce n'est pas si absurde qu'on le croit. Normalement je n'ai pas besoid
d'une
view. J'exécute la SP et j'ai les résultat. Le problème est que cette
SP
sera
appellé par un Rapport Crystal , jusqu'ici ça va. Mais le hic c'est que
le
rapport crystal utilisera des paramètre. Et il semble que Crystal
Report
lorsqu'il utilise paramètre, génére une requête SQL du genre SELECT....
where
parameter.... . Malheureusement un Select sur une SP ne fonctionne.
J'obtiens
donc un message d'erreur dans crystal disant 'Failes to open Rowset'.
Alors
que la SP fonctionne bien. DOnc je me suis dis je vais créer une view
et
cette view fera appelle a cette SP. Et un rapport crystal qui utilise
un
paramètre fonctionne très bien sur une view...

Une solution pourrait être d'utiliser une fonction, mais alors cette
fonction sera en fait la stored procedure. Mais la stored procedure
renvoie
plusieurs colonne, est-ce que cela ne causerai pas un problème.

Exemple:
CREATE My_StoredPRoc as Select * from authors....

Create function My_Function as exec My_StoredProc...

Comment appellé cette fonction dans la vue ?

CREATE VIEW My_view...

Select My_Function from QUOI ? (from authors ?)


"SQLpro [MVP]" a écrit :

ILyasse a écrit :
Bonjour,

J'amerai savoir si elle est possible de faire appelle à une stored
procedure
a partir d'nue view.
J'utilise Sql server 2000. Sachant que la stored procedure rempli
une
table
et à la fin fait un select de cette table. Je voudrai faire une view
qui me
renvoie le résultat de ce select.

Merci d'avance pour votre aide.




C'est totalement absurde :

Une SP peut encapsuler de nombreuses requêtes et gérer de multiples
transactions.
Or une requête EST une transaction.
On ne peut donc appeler une SP dans une requête pour la bonne et
simple
raison qu'il ne peut y avoir un fractionnement de transactions à
l'intérieur d'un SELECT par exemple !!! Cela permettrait de rendre la
transaction SELECT non atomique ... ce qui est parfaitement absurde.

En revanche une fonction ne peut pas contenir une transaction. Elle
peut
donc (et c'est son rôle) être appelée dans un ordre SQL quelconque
(SELECT, INSERT, UPDATE, DELETE...)


De plus une SP qui execute un SELECT final peut être vu comme une
requête SELECT. DOnc, ne changez rien à votre code. Ouvrez simplement
le
curseur côté client pour voir les données qui sont renvoyées par la
SP.

A +




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage
SQL
Le site sur le langage SQL et les SGBDR :
http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning,
optimisation
********************* http://www.datasapiens.com
***********************



















--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
bruno reiter
Je ne sais pas si c'est une grave erreur, mais ce dont tu parles est un
problème d'isolation et pour gérer les problèmes de modification de
structure pendant un select, il y a un lock sur le schema.

à ma connaissance, il y a transaction quand il y a modification de données
(toutes les définitions que je connais le disent), et une transaction, par
définition, est ACID, donc Isolée. Pendant le select il est tout a fait
possible de modifier les données accédées, soit après avoir laché le shared
lock (donc encore pendant le select), soit en faisant du dirty read. Donc
pour moi il n'y pas isolation et donc pas transaction.


br


"SQLpro [MVP]" a écrit dans le message de news:
%
erreur Bruno... Grave erreur !

Une requête même SELECT est une transaction....

En effet il faut garantir la lisibilité consistante de la table :
Que se passe t-il si lors de mon SELECT :
1) l'utilisateur A modifie le prix des article de la catégorie skdcsbklc
2) l'utilisateur B supprime une colonne
???

La norme SQL va même nettement plus loin en distinguant le STATEMENT SQL
et la requête SQL.

Est un STATEMENT toute requête SELECT qui ne contient :
pas de table dérivée, pas d'opération ensembliste, pas de CTE.

Et le STATEMENT est une transaction. En revanche la QUERY qui contiendrait
une table dérivée, une op ensembliste ou un CTE ne l'est pas et les
données peuvent changer entre l'exécution d'une des partie de la query.
Sur cet aspect de la norme, SQL Server le respecte à la lettre, tant est
si bien que si tu veut par exmple assurer la consistence d'une requête
comme celle-ci :

SELECT *
FROM (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS) T
UNION ALL
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS

Il te faut la placer dans une transaction

Si tu n'est pas convaincu, cherche les post de Steve Kass, Drew
University, MVP, à ce sujet !

Nous avons été très étonné que tout ceci fasse explicitement partie de la
norme, car nous croyons tous qu'une requête SELECT était atomique (donc
une transaction)...


A +

bruno reiter a écrit :
peut-etre est-ce la journée polémique? ;-)

Je ne pense pas qu'on puisse dire
une requête EST une transaction

Je suis certain que tu sais ce qu'est une transaction, mais qq1 qui n'est
pas sûr et lit cela peut etre induit en erreur.

Il y a transaction implicitement s'il y a
modification(INSERT,UPDATE,DELETE), ou si explicitement on donne un ordre
BEGIN TRAN

br

"SQLpro [MVP]" a écrit dans le message de
news:
ILyasse a écrit :
Bonjour,

J'amerai savoir si elle est possible de faire appelle à une stored
procedure a partir d'nue view.
J'utilise Sql server 2000. Sachant que la stored procedure rempli une
table et à la fin fait un select de cette table. Je voudrai faire une
view qui me renvoie le résultat de ce select. Merci d'avance pour votre
aide.




C'est totalement absurde :

Une SP peut encapsuler de nombreuses requêtes et gérer de multiples
transactions.
Or une requête EST une transaction.
On ne peut donc appeler une SP dans une requête pour la bonne et simple
raison qu'il ne peut y avoir un fractionnement de transactions à
l'intérieur d'un SELECT par exemple !!! Cela permettrait de rendre la
transaction SELECT non atomique ... ce qui est parfaitement absurde.

En revanche une fonction ne peut pas contenir une transaction. Elle peut
donc (et c'est son rôle) être appelée dans un ordre SQL quelconque
(SELECT, INSERT, UPDATE, DELETE...)


De plus une SP qui execute un SELECT final peut être vu comme une
requête SELECT. DOnc, ne changez rien à votre code. Ouvrez simplement le
curseur côté client pour voir les données qui sont renvoyées par la SP.

A +




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************








--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************


Avatar
ILyasse
Merci pour votre article mais malheureusement cela ne résoud pas mon problème.
J'avais plusieurs table temporaire dans ma SP qui sont utiliser lors de la
manipulation des données. A la fin j'insère tout dans une vrai table et je
fais un select de cette table. Les fonctions ne permettent pas d'utiliser des
tables temporaire, donc je ne peux pas les utiliser. De plus dans mon select
il y a un ORDER by donc je ne pourrais même pas l'utiliser dans ma vue....
Alors que faire ...?

"SQLpro [MVP]" a écrit :

ILyasse a écrit :
> Ok j'ai trouvé, mais le problème c'est que ma SP utilise des table
> temporaire, chose qu'on ne peut pas faire dans une vue ou une fonction...
> Alors que faire...?

mais si !!!!
Lisez l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L3.2


Après vous pouvez faire par exemple :

SELECT *
FROM dbo.MaFonction(...)

A +


>
> "bruno reiter" a écrit :
>
>> select ... from UDF_xxx where ...
>>
>> br
>>
>>
>> "ILyasse" a écrit dans le message de
>> news:
>>> Mais alors comment appellé cette fonction dans la vue.
>>> SELECT my_function from quoi ?... C'est ce que je ne comprend pas très
>>> bien
>>> ...
>>>
>>> "bruno reiter" a écrit :
>>>
>>>> non, la fonction ne pourra pas appeler la SP, mais la fonction peut faire
>>>> exactement ce que fait la SP
>>>>
>>>> br
>>>>
>>>> "ILyasse" a écrit dans le message de
>>>> news:
>>>>> Ce n'est pas si absurde qu'on le croit. Normalement je n'ai pas besoid
>>>>> d'une
>>>>> view. J'exécute la SP et j'ai les résultat. Le problème est que cette
>>>>> SP
>>>>> sera
>>>>> appellé par un Rapport Crystal , jusqu'ici ça va. Mais le hic c'est que
>>>>> le
>>>>> rapport crystal utilisera des paramètre. Et il semble que Crystal
>>>>> Report
>>>>> lorsqu'il utilise paramètre, génére une requête SQL du genre SELECT....
>>>>> where
>>>>> parameter.... . Malheureusement un Select sur une SP ne fonctionne.
>>>>> J'obtiens
>>>>> donc un message d'erreur dans crystal disant 'Failes to open Rowset'.
>>>>> Alors
>>>>> que la SP fonctionne bien. DOnc je me suis dis je vais créer une view
>>>>> et
>>>>> cette view fera appelle a cette SP. Et un rapport crystal qui utilise
>>>>> un
>>>>> paramètre fonctionne très bien sur une view...
>>>>>
>>>>> Une solution pourrait être d'utiliser une fonction, mais alors cette
>>>>> fonction sera en fait la stored procedure. Mais la stored procedure
>>>>> renvoie
>>>>> plusieurs colonne, est-ce que cela ne causerai pas un problème.
>>>>>
>>>>> Exemple:
>>>>> CREATE My_StoredPRoc as Select * from authors....
>>>>>
>>>>> Create function My_Function as exec My_StoredProc...
>>>>>
>>>>> Comment appellé cette fonction dans la vue ?
>>>>>
>>>>> CREATE VIEW My_view...
>>>>>
>>>>> Select My_Function from QUOI ? (from authors ?)
>>>>>
>>>>>
>>>>> "SQLpro [MVP]" a écrit :
>>>>>
>>>>>> ILyasse a écrit :
>>>>>>> Bonjour,
>>>>>>>
>>>>>>> J'amerai savoir si elle est possible de faire appelle à une stored
>>>>>>> procedure
>>>>>>> a partir d'nue view.
>>>>>>> J'utilise Sql server 2000. Sachant que la stored procedure rempli
>>>>>>> une
>>>>>>> table
>>>>>>> et à la fin fait un select de cette table. Je voudrai faire une view
>>>>>>> qui me
>>>>>>> renvoie le résultat de ce select.
>>>>>>>
>>>>>>> Merci d'avance pour votre aide.
>>>>>>>
>>>>>>>
>>>>>> C'est totalement absurde :
>>>>>>
>>>>>> Une SP peut encapsuler de nombreuses requêtes et gérer de multiples
>>>>>> transactions.
>>>>>> Or une requête EST une transaction.
>>>>>> On ne peut donc appeler une SP dans une requête pour la bonne et
>>>>>> simple
>>>>>> raison qu'il ne peut y avoir un fractionnement de transactions à
>>>>>> l'intérieur d'un SELECT par exemple !!! Cela permettrait de rendre la
>>>>>> transaction SELECT non atomique ... ce qui est parfaitement absurde.
>>>>>>
>>>>>> En revanche une fonction ne peut pas contenir une transaction. Elle
>>>>>> peut
>>>>>> donc (et c'est son rôle) être appelée dans un ordre SQL quelconque
>>>>>> (SELECT, INSERT, UPDATE, DELETE...)
>>>>>>
>>>>>>
>>>>>> De plus une SP qui execute un SELECT final peut être vu comme une
>>>>>> requête SELECT. DOnc, ne changez rien à votre code. Ouvrez simplement
>>>>>> le
>>>>>> curseur côté client pour voir les données qui sont renvoyées par la
>>>>>> SP.
>>>>>>
>>>>>> A +
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Frédéric BROUARD, MVP SQL Server, expert bases de données et langage
>>>>>> SQL
>>>>>> Le site sur le langage SQL et les SGBDR :
>>>>>> http://sqlpro.developpez.com
>>>>>> Audit, conseil, expertise, formation, modélisation, tuning,
>>>>>> optimisation
>>>>>> ********************* http://www.datasapiens.com
>>>>>> ***********************
>>>>>>
>>>>
>>>>
>>
>>


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************



Avatar
SQLpro [MVP]
ILyasse a écrit :
Merci pour votre article mais malheureusement cela ne résoud pas mon problème.
J'avais plusieurs table temporaire dans ma SP qui sont utiliser lors de la
manipulation des données.



la plupart des tables temporaires sont inutiles. Des SELECT suffisent.


A la fin j'insère tout dans une vrai table et je
fais un select de cette table. Les fonctions ne permettent pas d'utiliser des
tables temporaire, donc je ne peux pas les utiliser. De plus dans mon select
il y a un ORDER by donc je ne pourrais même pas l'utiliser dans ma vue....



Si en faisant SELECT TOP 100 PERCENT WITH TIES


A +

Alors que faire ...?

"SQLpro [MVP]" a écrit :

ILyasse a écrit :
Ok j'ai trouvé, mais le problème c'est que ma SP utilise des table
temporaire, chose qu'on ne peut pas faire dans une vue ou une fonction...
Alors que faire...?


mais si !!!!
Lisez l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L3.2


Après vous pouvez faire par exemple :

SELECT *
FROM dbo.MaFonction(...)

A +


"bruno reiter" a écrit :

select ... from UDF_xxx where ...

br


"ILyasse" a écrit dans le message de
news:
Mais alors comment appellé cette fonction dans la vue.
SELECT my_function from quoi ?... C'est ce que je ne comprend pas très
bien
...

"bruno reiter" a écrit :

non, la fonction ne pourra pas appeler la SP, mais la fonction peut faire
exactement ce que fait la SP

br

"ILyasse" a écrit dans le message de
news:
Ce n'est pas si absurde qu'on le croit. Normalement je n'ai pas besoid
d'une
view. J'exécute la SP et j'ai les résultat. Le problème est que cette
SP
sera
appellé par un Rapport Crystal , jusqu'ici ça va. Mais le hic c'est que
le
rapport crystal utilisera des paramètre. Et il semble que Crystal
Report
lorsqu'il utilise paramètre, génére une requête SQL du genre SELECT....
where
parameter.... . Malheureusement un Select sur une SP ne fonctionne.
J'obtiens
donc un message d'erreur dans crystal disant 'Failes to open Rowset'.
Alors
que la SP fonctionne bien. DOnc je me suis dis je vais créer une view
et
cette view fera appelle a cette SP. Et un rapport crystal qui utilise
un
paramètre fonctionne très bien sur une view...

Une solution pourrait être d'utiliser une fonction, mais alors cette
fonction sera en fait la stored procedure. Mais la stored procedure
renvoie
plusieurs colonne, est-ce que cela ne causerai pas un problème.

Exemple:
CREATE My_StoredPRoc as Select * from authors....

Create function My_Function as exec My_StoredProc...

Comment appellé cette fonction dans la vue ?

CREATE VIEW My_view...

Select My_Function from QUOI ? (from authors ?)


"SQLpro [MVP]" a écrit :

ILyasse a écrit :
Bonjour,

J'amerai savoir si elle est possible de faire appelle à une stored
procedure
a partir d'nue view.
J'utilise Sql server 2000. Sachant que la stored procedure rempli
une
table
et à la fin fait un select de cette table. Je voudrai faire une view
qui me
renvoie le résultat de ce select.

Merci d'avance pour votre aide.




C'est totalement absurde :

Une SP peut encapsuler de nombreuses requêtes et gérer de multiples
transactions.
Or une requête EST une transaction.
On ne peut donc appeler une SP dans une requête pour la bonne et
simple
raison qu'il ne peut y avoir un fractionnement de transactions à
l'intérieur d'un SELECT par exemple !!! Cela permettrait de rendre la
transaction SELECT non atomique ... ce qui est parfaitement absurde.

En revanche une fonction ne peut pas contenir une transaction. Elle
peut
donc (et c'est son rôle) être appelée dans un ordre SQL quelconque
(SELECT, INSERT, UPDATE, DELETE...)


De plus une SP qui execute un SELECT final peut être vu comme une
requête SELECT. DOnc, ne changez rien à votre code. Ouvrez simplement
le
curseur côté client pour voir les données qui sont renvoyées par la
SP.

A +




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage
SQL
Le site sur le langage SQL et les SGBDR :
http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning,
optimisation
********************* http://www.datasapiens.com
***********************
















--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************







--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
SQLpro [MVP]
bruno reiter a écrit :
Je ne sais pas si c'est une grave erreur, mais ce dont tu parles est un
problème d'isolation et pour gérer les problèmes de modification de
structure pendant un select, il y a un lock sur le schema.



Et comment se pilote le niveau d'isolation ?

SET TRANSACTION ISOLATION LEVEL ....

On est donc bien dans une transaction !

CQFD



à ma connaissance, il y a transaction quand il y a modification de données



Non : tout ordre SQL est une transaction. Y compris les ordres du DDL.

(toutes les définitions que je connais le disent),



He bien donne moi quelques références de ces définitions, car elles sont
fausses !


et une transaction, par
définition, est ACID, donc Isolée. Pendant le select il est tout a fait
possible de modifier les données accédées, soit après avoir laché le shared
lock (donc encore pendant le select), soit en faisant du dirty read. Donc
pour moi il n'y pas isolation et donc pas transaction.





A +

br


"SQLpro [MVP]" a écrit dans le message de news:
%
erreur Bruno... Grave erreur !

Une requête même SELECT est une transaction....

En effet il faut garantir la lisibilité consistante de la table :
Que se passe t-il si lors de mon SELECT :
1) l'utilisateur A modifie le prix des article de la catégorie skdcsbklc
2) l'utilisateur B supprime une colonne
???

La norme SQL va même nettement plus loin en distinguant le STATEMENT SQL
et la requête SQL.

Est un STATEMENT toute requête SELECT qui ne contient :
pas de table dérivée, pas d'opération ensembliste, pas de CTE.

Et le STATEMENT est une transaction. En revanche la QUERY qui contiendrait
une table dérivée, une op ensembliste ou un CTE ne l'est pas et les
données peuvent changer entre l'exécution d'une des partie de la query.
Sur cet aspect de la norme, SQL Server le respecte à la lettre, tant est
si bien que si tu veut par exmple assurer la consistence d'une requête
comme celle-ci :

SELECT *
FROM (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS) T
UNION ALL
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS

Il te faut la placer dans une transaction

Si tu n'est pas convaincu, cherche les post de Steve Kass, Drew
University, MVP, à ce sujet !

Nous avons été très étonné que tout ceci fasse explicitement partie de la
norme, car nous croyons tous qu'une requête SELECT était atomique (donc
une transaction)...


A +

bruno reiter a écrit :
peut-etre est-ce la journée polémique? ;-)

Je ne pense pas qu'on puisse dire
une requête EST une transaction

Je suis certain que tu sais ce qu'est une transaction, mais qq1 qui n'est
pas sûr et lit cela peut etre induit en erreur.

Il y a transaction implicitement s'il y a
modification(INSERT,UPDATE,DELETE), ou si explicitement on donne un ordre
BEGIN TRAN

br

"SQLpro [MVP]" a écrit dans le message de
news:
ILyasse a écrit :
Bonjour,

J'amerai savoir si elle est possible de faire appelle à une stored
procedure a partir d'nue view.
J'utilise Sql server 2000. Sachant que la stored procedure rempli une
table et à la fin fait un select de cette table. Je voudrai faire une
view qui me renvoie le résultat de ce select. Merci d'avance pour votre
aide.




C'est totalement absurde :

Une SP peut encapsuler de nombreuses requêtes et gérer de multiples
transactions.
Or une requête EST une transaction.
On ne peut donc appeler une SP dans une requête pour la bonne et simple
raison qu'il ne peut y avoir un fractionnement de transactions à
l'intérieur d'un SELECT par exemple !!! Cela permettrait de rendre la
transaction SELECT non atomique ... ce qui est parfaitement absurde.

En revanche une fonction ne peut pas contenir une transaction. Elle peut
donc (et c'est son rôle) être appelée dans un ordre SQL quelconque
(SELECT, INSERT, UPDATE, DELETE...)


De plus une SP qui execute un SELECT final peut être vu comme une
requête SELECT. DOnc, ne changez rien à votre code. Ouvrez simplement le
curseur côté client pour voir les données qui sont renvoyées par la SP.

A +




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************








--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Synopsis
On peut créer des tables temporaires dans une fonction.

La synthaxe est :

DECLARE @temp TABLE (col 1 int not null, .....)

"ILyasse" a écrit dans le message de
news:
Merci pour votre article mais malheureusement cela ne résoud pas mon


problème.
J'avais plusieurs table temporaire dans ma SP qui sont utiliser lors de la
manipulation des données. A la fin j'insère tout dans une vrai table et je
fais un select de cette table. Les fonctions ne permettent pas d'utiliser


des
tables temporaire, donc je ne peux pas les utiliser. De plus dans mon


select
il y a un ORDER by donc je ne pourrais même pas l'utiliser dans ma vue....
Alors que faire ...?

"SQLpro [MVP]" a écrit :

> ILyasse a écrit :
> > Ok j'ai trouvé, mais le problème c'est que ma SP utilise des table
> > temporaire, chose qu'on ne peut pas faire dans une vue ou une


fonction...
> > Alors que faire...?
>
> mais si !!!!
> Lisez l'article que j'ai écrit à ce sujet :
> http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L3.2
>
>
> Après vous pouvez faire par exemple :
>
> SELECT *
> FROM dbo.MaFonction(...)
>
> A +
>
>
> >
> > "bruno reiter" a écrit :
> >
> >> select ... from UDF_xxx where ...
> >>
> >> br
> >>
> >>
> >> "ILyasse" a écrit dans le message


de
> >> news:
> >>> Mais alors comment appellé cette fonction dans la vue.
> >>> SELECT my_function from quoi ?... C'est ce que je ne comprend pas


très
> >>> bien
> >>> ...
> >>>
> >>> "bruno reiter" a écrit :
> >>>
> >>>> non, la fonction ne pourra pas appeler la SP, mais la fonction peut


faire
> >>>> exactement ce que fait la SP
> >>>>
> >>>> br
> >>>>
> >>>> "ILyasse" a écrit dans le


message de
> >>>> news:
> >>>>> Ce n'est pas si absurde qu'on le croit. Normalement je n'ai pas


besoid
> >>>>> d'une
> >>>>> view. J'exécute la SP et j'ai les résultat. Le problème est que


cette
> >>>>> SP
> >>>>> sera
> >>>>> appellé par un Rapport Crystal , jusqu'ici ça va. Mais le hic


c'est que
> >>>>> le
> >>>>> rapport crystal utilisera des paramètre. Et il semble que Crystal
> >>>>> Report
> >>>>> lorsqu'il utilise paramètre, génére une requête SQL du genre


SELECT....
> >>>>> where
> >>>>> parameter.... . Malheureusement un Select sur une SP ne


fonctionne.
> >>>>> J'obtiens
> >>>>> donc un message d'erreur dans crystal disant 'Failes to open


Rowset'.
> >>>>> Alors
> >>>>> que la SP fonctionne bien. DOnc je me suis dis je vais créer une


view
> >>>>> et
> >>>>> cette view fera appelle a cette SP. Et un rapport crystal qui


utilise
> >>>>> un
> >>>>> paramètre fonctionne très bien sur une view...
> >>>>>
> >>>>> Une solution pourrait être d'utiliser une fonction, mais alors


cette
> >>>>> fonction sera en fait la stored procedure. Mais la stored


procedure
> >>>>> renvoie
> >>>>> plusieurs colonne, est-ce que cela ne causerai pas un problème.
> >>>>>
> >>>>> Exemple:
> >>>>> CREATE My_StoredPRoc as Select * from authors....
> >>>>>
> >>>>> Create function My_Function as exec My_StoredProc...
> >>>>>
> >>>>> Comment appellé cette fonction dans la vue ?
> >>>>>
> >>>>> CREATE VIEW My_view...
> >>>>>
> >>>>> Select My_Function from QUOI ? (from authors ?)
> >>>>>
> >>>>>
> >>>>> "SQLpro [MVP]" a écrit :
> >>>>>
> >>>>>> ILyasse a écrit :
> >>>>>>> Bonjour,
> >>>>>>>
> >>>>>>> J'amerai savoir si elle est possible de faire appelle à une


stored
> >>>>>>> procedure
> >>>>>>> a partir d'nue view.
> >>>>>>> J'utilise Sql server 2000. Sachant que la stored procedure


rempli
> >>>>>>> une
> >>>>>>> table
> >>>>>>> et à la fin fait un select de cette table. Je voudrai faire une


view
> >>>>>>> qui me
> >>>>>>> renvoie le résultat de ce select.
> >>>>>>>
> >>>>>>> Merci d'avance pour votre aide.
> >>>>>>>
> >>>>>>>
> >>>>>> C'est totalement absurde :
> >>>>>>
> >>>>>> Une SP peut encapsuler de nombreuses requêtes et gérer de


multiples
> >>>>>> transactions.
> >>>>>> Or une requête EST une transaction.
> >>>>>> On ne peut donc appeler une SP dans une requête pour la bonne et
> >>>>>> simple
> >>>>>> raison qu'il ne peut y avoir un fractionnement de transactions à
> >>>>>> l'intérieur d'un SELECT par exemple !!! Cela permettrait de


rendre la
> >>>>>> transaction SELECT non atomique ... ce qui est parfaitement


absurde.
> >>>>>>
> >>>>>> En revanche une fonction ne peut pas contenir une transaction.


Elle
> >>>>>> peut
> >>>>>> donc (et c'est son rôle) être appelée dans un ordre SQL


quelconque
> >>>>>> (SELECT, INSERT, UPDATE, DELETE...)
> >>>>>>
> >>>>>>
> >>>>>> De plus une SP qui execute un SELECT final peut être vu comme une
> >>>>>> requête SELECT. DOnc, ne changez rien à votre code. Ouvrez


simplement
> >>>>>> le
> >>>>>> curseur côté client pour voir les données qui sont renvoyées par


la
> >>>>>> SP.
> >>>>>>
> >>>>>> A +
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> --
> >>>>>> Frédéric BROUARD, MVP SQL Server, expert bases de données et


langage
> >>>>>> SQL
> >>>>>> Le site sur le langage SQL et les SGBDR :
> >>>>>> http://sqlpro.developpez.com
> >>>>>> Audit, conseil, expertise, formation, modélisation, tuning,
> >>>>>> optimisation
> >>>>>> ********************* http://www.datasapiens.com
> >>>>>> ***********************
> >>>>>>
> >>>>
> >>>>
> >>
> >>
>
>
> --
> Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
> Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
> Audit, conseil, expertise, formation, modélisation, tuning, optimisation
> ********************* http://www.datasapiens.com ***********************
>


Avatar
ILyasse
Merci pour votre aide. Mais j'ai changé de méthode.

"Synopsis" a écrit :

On peut créer des tables temporaires dans une fonction.

La synthaxe est :

DECLARE @temp TABLE (col 1 int not null, .....)

"ILyasse" a écrit dans le message de
news:
> Merci pour votre article mais malheureusement cela ne résoud pas mon
problème.
> J'avais plusieurs table temporaire dans ma SP qui sont utiliser lors de la
> manipulation des données. A la fin j'insère tout dans une vrai table et je
> fais un select de cette table. Les fonctions ne permettent pas d'utiliser
des
> tables temporaire, donc je ne peux pas les utiliser. De plus dans mon
select
> il y a un ORDER by donc je ne pourrais même pas l'utiliser dans ma vue....
> Alors que faire ...?
>
> "SQLpro [MVP]" a écrit :
>
> > ILyasse a écrit :
> > > Ok j'ai trouvé, mais le problème c'est que ma SP utilise des table
> > > temporaire, chose qu'on ne peut pas faire dans une vue ou une
fonction...
> > > Alors que faire...?
> >
> > mais si !!!!
> > Lisez l'article que j'ai écrit à ce sujet :
> > http://sqlpro.developpez.com/cours/sqlserver/transactsql/#L3.2
> >
> >
> > Après vous pouvez faire par exemple :
> >
> > SELECT *
> > FROM dbo.MaFonction(...)
> >
> > A +
> >
> >
> > >
> > > "bruno reiter" a écrit :
> > >
> > >> select ... from UDF_xxx where ...
> > >>
> > >> br
> > >>
> > >>
> > >> "ILyasse" a écrit dans le message
de
> > >> news:
> > >>> Mais alors comment appellé cette fonction dans la vue.
> > >>> SELECT my_function from quoi ?... C'est ce que je ne comprend pas
très
> > >>> bien
> > >>> ...
> > >>>
> > >>> "bruno reiter" a écrit :
> > >>>
> > >>>> non, la fonction ne pourra pas appeler la SP, mais la fonction peut
faire
> > >>>> exactement ce que fait la SP
> > >>>>
> > >>>> br
> > >>>>
> > >>>> "ILyasse" a écrit dans le
message de
> > >>>> news:
> > >>>>> Ce n'est pas si absurde qu'on le croit. Normalement je n'ai pas
besoid
> > >>>>> d'une
> > >>>>> view. J'exécute la SP et j'ai les résultat. Le problème est que
cette
> > >>>>> SP
> > >>>>> sera
> > >>>>> appellé par un Rapport Crystal , jusqu'ici ça va. Mais le hic
c'est que
> > >>>>> le
> > >>>>> rapport crystal utilisera des paramètre. Et il semble que Crystal
> > >>>>> Report
> > >>>>> lorsqu'il utilise paramètre, génére une requête SQL du genre
SELECT....
> > >>>>> where
> > >>>>> parameter.... . Malheureusement un Select sur une SP ne
fonctionne.
> > >>>>> J'obtiens
> > >>>>> donc un message d'erreur dans crystal disant 'Failes to open
Rowset'.
> > >>>>> Alors
> > >>>>> que la SP fonctionne bien. DOnc je me suis dis je vais créer une
view
> > >>>>> et
> > >>>>> cette view fera appelle a cette SP. Et un rapport crystal qui
utilise
> > >>>>> un
> > >>>>> paramètre fonctionne très bien sur une view...
> > >>>>>
> > >>>>> Une solution pourrait être d'utiliser une fonction, mais alors
cette
> > >>>>> fonction sera en fait la stored procedure. Mais la stored
procedure
> > >>>>> renvoie
> > >>>>> plusieurs colonne, est-ce que cela ne causerai pas un problème.
> > >>>>>
> > >>>>> Exemple:
> > >>>>> CREATE My_StoredPRoc as Select * from authors....
> > >>>>>
> > >>>>> Create function My_Function as exec My_StoredProc...
> > >>>>>
> > >>>>> Comment appellé cette fonction dans la vue ?
> > >>>>>
> > >>>>> CREATE VIEW My_view...
> > >>>>>
> > >>>>> Select My_Function from QUOI ? (from authors ?)
> > >>>>>
> > >>>>>
> > >>>>> "SQLpro [MVP]" a écrit :
> > >>>>>
> > >>>>>> ILyasse a écrit :
> > >>>>>>> Bonjour,
> > >>>>>>>
> > >>>>>>> J'amerai savoir si elle est possible de faire appelle à une
stored
> > >>>>>>> procedure
> > >>>>>>> a partir d'nue view.
> > >>>>>>> J'utilise Sql server 2000. Sachant que la stored procedure
rempli
> > >>>>>>> une
> > >>>>>>> table
> > >>>>>>> et à la fin fait un select de cette table. Je voudrai faire une
view
> > >>>>>>> qui me
> > >>>>>>> renvoie le résultat de ce select.
> > >>>>>>>
> > >>>>>>> Merci d'avance pour votre aide.
> > >>>>>>>
> > >>>>>>>
> > >>>>>> C'est totalement absurde :
> > >>>>>>
> > >>>>>> Une SP peut encapsuler de nombreuses requêtes et gérer de
multiples
> > >>>>>> transactions.
> > >>>>>> Or une requête EST une transaction.
> > >>>>>> On ne peut donc appeler une SP dans une requête pour la bonne et
> > >>>>>> simple
> > >>>>>> raison qu'il ne peut y avoir un fractionnement de transactions à
> > >>>>>> l'intérieur d'un SELECT par exemple !!! Cela permettrait de
rendre la
> > >>>>>> transaction SELECT non atomique ... ce qui est parfaitement
absurde.
> > >>>>>>
> > >>>>>> En revanche une fonction ne peut pas contenir une transaction.
Elle
> > >>>>>> peut
> > >>>>>> donc (et c'est son rôle) être appelée dans un ordre SQL
quelconque
> > >>>>>> (SELECT, INSERT, UPDATE, DELETE...)
> > >>>>>>
> > >>>>>>
> > >>>>>> De plus une SP qui execute un SELECT final peut être vu comme une
> > >>>>>> requête SELECT. DOnc, ne changez rien à votre code. Ouvrez
simplement
> > >>>>>> le
> > >>>>>> curseur côté client pour voir les données qui sont renvoyées par
la
> > >>>>>> SP.
> > >>>>>>
> > >>>>>> A +
> > >>>>>>
> > >>>>>>
> > >>>>>>
> > >>>>>>
> > >>>>>> --
> > >>>>>> Frédéric BROUARD, MVP SQL Server, expert bases de données et
langage
> > >>>>>> SQL
> > >>>>>> Le site sur le langage SQL et les SGBDR :
> > >>>>>> http://sqlpro.developpez.com
> > >>>>>> Audit, conseil, expertise, formation, modélisation, tuning,
> > >>>>>> optimisation
> > >>>>>> ********************* http://www.datasapiens.com
> > >>>>>> ***********************
> > >>>>>>
> > >>>>
> > >>>>
> > >>
> > >>
> >
> >
> > --
> > Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
> > Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
> > Audit, conseil, expertise, formation, modélisation, tuning, optimisation
> > ********************* http://www.datasapiens.com ***********************
> >





1 2