J'ai une procédure stockée qui renvoie des lignes:
CREATE PROCEDURE MyProc
AS
BEGIN
SELECT * FROM MyTable
END
Ma procédure actuelle est un peu plus compliquée, c'est pourquoi un sproc est nécessaire.
Est-il possible de sélectionner la sortie en appelant cette procédure?
Quelque chose comme:
SELECT * FROM (EXEC MyProc) AS TEMP
J'ai besoin d'utiliser SELECT TOP X
,, ROW_NUMBER
et une WHERE
clause supplémentaire pour paginer mes données, et je ne veux pas vraiment passer ces valeurs en tant que paramètres.
sql
sql-server
sql-server-2005
stored-procedures
jonathanpeppers
la source
la source
Réponses:
Vous pouvez utiliser une fonction définie par l' utilisateur ou une vue au lieu d'une procédure.
Une procédure peut renvoyer plusieurs jeux de résultats, chacun avec son propre schéma. Il ne convient pas pour une utilisation dans une
SELECT
déclaration.la source
Vous pouvez
... sql ....
la source
INSERT #T
ouINSERT @T
est qu'uneINSERT EXEC
instruction ne peut pas être imbriquée. Si la procédure stockée contient déjà unINSERT EXEC
, cela ne fonctionnera pas.Vous voulez soit une fonction Table-Valued soit insérer votre EXEC dans une table temporaire:
la source
INSERT #T
ouINSERT @T
est qu'uneINSERT EXEC
instruction ne peut pas être imbriquée. Si la procédure stockée contient déjà unINSERT EXEC
, cela ne fonctionnera pas.Vous devez lire sur OPENROWSET et OPENQUERY
la source
Vous devez déclarer un type de table qui contient le même nombre de colonnes que votre procédure de stockage renvoie. Les types de données des colonnes dans le type de table et les colonnes retournées par les procédures doivent être identiques
Ensuite, vous devez insérer le résultat de votre procédure stockée dans le type de table que vous venez de définir
En fin de compte, sélectionnez simplement votre type de table
la source
Il n'est pas nécessaire d'utiliser une table temporaire.
C'est ma solution
la source
sp_serveroption 'MYSERVER', 'DATA ACCESS', TRUE;
Vous pouvez copier la sortie de sp dans une table temporelle.
la source
utiliser OPENQUERY et avant d'exécuter l'ensemble 'SET FMTONLY OFF; SET NOCOUNT ON; '
Essayez cet exemple de code:
la source
Essayez de convertir votre procédure en une fonction en ligne qui renvoie un tableau comme suit:
Et puis vous pouvez l'appeler comme
Vous avez également la possibilité de passer des paramètres à la fonction comme suit:
Et appelle ça
la source
Si "ACCÈS AUX DONNÉES" est faux,
après,
Ça marche.
la source
Vous pouvez tricher un peu avec OPENROWSET:
Bien sûr, cela exécuterait tout le SP à chaque fois.
la source
Par souci de simplicité et pour le rendre réexécutable, j'ai utilisé un système StoredProcedure "sp_readerrorlog" pour obtenir les données:
la source
Il semble que vous ayez simplement besoin d'utiliser une vue . Une vue permet à une requête d'être représentée sous forme de table afin qu'elle, la vue, puisse être interrogée.
la source
Si votre serveur s'appelle SERVERX par exemple, c'est comme ça que je l'ai fait ...
Pour vérifier que cela a fonctionné, j'ai commenté la
EXEC()
ligne de commande et l' ai remplacée parSELECT @CMD
pour revoir la commande avant d'essayer de l'exécuter! C'était pour s'assurer que tout le nombre correct de guillemets simples était au bon endroit. :-)J'espère que cela aide quelqu'un.
la source