Accéder au jeu d'enregistrement d'une procédure stockée
1 réponse
Alain DIART
Bonjour,
J'ai défini une procédure stockée SP1 qui exécute une requête, je veux
utiliser cette requete au sein d'une procédure stockée SP2, comment j'accède
à ces données ?
Mon code est du genre :
CREATE PROCEDURE dbo.SP1
AS
BEGIN
DECLARE @strSQL nvarchar(255)
-- ici plein de traitements aboutissant à un truc du genre...
SET @strSQL = 'SELECT identifiant FROM MaTable1'
EXEC (@strSQL)
END
CREATE PROCEDURE dbo.SP2
AS
BEGIN
EXEC SP1
SELECT * FROM MaTable2 WHERE MonChamp2 IN (...)
-- à la place de ... je voudrais le jeu d'enregistrement calculé par SP1
END
J'ai penser appeller SP1 dans une fonction utilisateur UDF1 et utiliser UDF1
dans SP2 comme suit, le résultat de l'appel de l'UDF est une erreur "Only
functions and extended stored procedures can be executed from within a
function." :
CREATE PROCEDURE dbo.SP1
@retCursor CURSOR VARYING OUTPUT
AS
BEGIN
DECLARE @strSQL nvarchar(255)
-- ici plein de traitements aboutissant à un truc du genre...
SET @strSQL = 'SET @retCursor = CURSOR FOR SELECT identifiant FROM
MaTable1'
EXEC (@strSQL)
END
CREATE FUNCTION dbo.UDF1
RETURNS @retTable TABLE(identifiant bigint primary key) AS
BEGIN
DECLARE @crRetIds CURSOR
DECLARE @retId bigint
EXECUTE dbo.SP1, @crRetIds OUTPUT
FETCH NEXT FROM @crRetIds INTO @retId
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT @retTable (identifiant)
VALUES (@retId)
FETCH NEXT FROM @crRetIds INTO @retId
END
CLOSE @crRetIds
DEALLOCATE @crRetIds
RETURN
END
CREATE PROCEDURE dbo.SP2
AS
BEGIN
SELECT * FROM MaTable2 WHERE MonChamp2 IN (dbo.UDF1())
END
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
Nicolas LETULLIER
En effet, il n'est pas possible d'exécuter une procédure stockée dans une UDF.
Dans ton cas, la solution serait de passer par une table temporaire dans SP2, avec un
INSERT INTO #tabletemp EXEC SP1
Ensuite, tu fais une jointure entre MaTable2 et #tabletemp (à la place du IN)
Nicolas.
"Alain DIART" <alain(nospamthanks)@cnsx.net> a écrit dans le message de news:
Bonjour,
J'ai défini une procédure stockée SP1 qui exécute une requête, je veux utiliser cette requete au sein d'une procédure stockée SP2, comment
j'accède
à ces données ?
Mon code est du genre :
CREATE PROCEDURE dbo.SP1 AS BEGIN DECLARE @strSQL nvarchar(255)
-- ici plein de traitements aboutissant à un truc du genre... SET @strSQL = 'SELECT identifiant FROM MaTable1' EXEC (@strSQL) END
CREATE PROCEDURE dbo.SP2 AS BEGIN
EXEC SP1
SELECT * FROM MaTable2 WHERE MonChamp2 IN (...) -- à la place de ... je voudrais le jeu d'enregistrement calculé par
SP1
END
J'ai penser appeller SP1 dans une fonction utilisateur UDF1 et utiliser
UDF1
dans SP2 comme suit, le résultat de l'appel de l'UDF est une erreur "Only functions and extended stored procedures can be executed from within a function." :
CREATE PROCEDURE dbo.SP1 @retCursor CURSOR VARYING OUTPUT AS BEGIN DECLARE @strSQL nvarchar(255)
-- ici plein de traitements aboutissant à un truc du genre... SET @strSQL = 'SET @retCursor = CURSOR FOR SELECT identifiant FROM MaTable1' EXEC (@strSQL) END
CREATE FUNCTION dbo.UDF1 RETURNS @retTable TABLE(identifiant bigint primary key) AS BEGIN DECLARE @crRetIds CURSOR DECLARE @retId bigint
EXECUTE dbo.SP1, @crRetIds OUTPUT
FETCH NEXT FROM @crRetIds INTO @retId
WHILE @@FETCH_STATUS = 0 BEGIN
INSERT @retTable (identifiant) VALUES (@retId)
FETCH NEXT FROM @crRetIds INTO @retId END
CLOSE @crRetIds DEALLOCATE @crRetIds
RETURN
END
CREATE PROCEDURE dbo.SP2 AS BEGIN
SELECT * FROM MaTable2 WHERE MonChamp2 IN (dbo.UDF1()) END
Comment arriver à mon but...
Merci
Alain
En effet, il n'est pas possible d'exécuter une procédure stockée dans une
UDF.
Dans ton cas, la solution serait de passer par une table temporaire dans
SP2, avec un
INSERT INTO #tabletemp EXEC SP1
Ensuite, tu fais une jointure entre MaTable2 et #tabletemp (à la place du
IN)
Nicolas.
"Alain DIART" <alain(nospamthanks)@cnsx.net> a écrit dans le message de
news:ukuFvUhmDHA.2364@TK2MSFTNGP11.phx.gbl...
Bonjour,
J'ai défini une procédure stockée SP1 qui exécute une requête, je veux
utiliser cette requete au sein d'une procédure stockée SP2, comment
j'accède
à ces données ?
Mon code est du genre :
CREATE PROCEDURE dbo.SP1
AS
BEGIN
DECLARE @strSQL nvarchar(255)
-- ici plein de traitements aboutissant à un truc du genre...
SET @strSQL = 'SELECT identifiant FROM MaTable1'
EXEC (@strSQL)
END
CREATE PROCEDURE dbo.SP2
AS
BEGIN
EXEC SP1
SELECT * FROM MaTable2 WHERE MonChamp2 IN (...)
-- à la place de ... je voudrais le jeu d'enregistrement calculé par
SP1
END
J'ai penser appeller SP1 dans une fonction utilisateur UDF1 et utiliser
UDF1
dans SP2 comme suit, le résultat de l'appel de l'UDF est une erreur "Only
functions and extended stored procedures can be executed from within a
function." :
CREATE PROCEDURE dbo.SP1
@retCursor CURSOR VARYING OUTPUT
AS
BEGIN
DECLARE @strSQL nvarchar(255)
-- ici plein de traitements aboutissant à un truc du genre...
SET @strSQL = 'SET @retCursor = CURSOR FOR SELECT identifiant FROM
MaTable1'
EXEC (@strSQL)
END
CREATE FUNCTION dbo.UDF1
RETURNS @retTable TABLE(identifiant bigint primary key) AS
BEGIN
DECLARE @crRetIds CURSOR
DECLARE @retId bigint
EXECUTE dbo.SP1, @crRetIds OUTPUT
FETCH NEXT FROM @crRetIds INTO @retId
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT @retTable (identifiant)
VALUES (@retId)
FETCH NEXT FROM @crRetIds INTO @retId
END
CLOSE @crRetIds
DEALLOCATE @crRetIds
RETURN
END
CREATE PROCEDURE dbo.SP2
AS
BEGIN
SELECT * FROM MaTable2 WHERE MonChamp2 IN (dbo.UDF1())
END
En effet, il n'est pas possible d'exécuter une procédure stockée dans une UDF.
Dans ton cas, la solution serait de passer par une table temporaire dans SP2, avec un
INSERT INTO #tabletemp EXEC SP1
Ensuite, tu fais une jointure entre MaTable2 et #tabletemp (à la place du IN)
Nicolas.
"Alain DIART" <alain(nospamthanks)@cnsx.net> a écrit dans le message de news:
Bonjour,
J'ai défini une procédure stockée SP1 qui exécute une requête, je veux utiliser cette requete au sein d'une procédure stockée SP2, comment
j'accède
à ces données ?
Mon code est du genre :
CREATE PROCEDURE dbo.SP1 AS BEGIN DECLARE @strSQL nvarchar(255)
-- ici plein de traitements aboutissant à un truc du genre... SET @strSQL = 'SELECT identifiant FROM MaTable1' EXEC (@strSQL) END
CREATE PROCEDURE dbo.SP2 AS BEGIN
EXEC SP1
SELECT * FROM MaTable2 WHERE MonChamp2 IN (...) -- à la place de ... je voudrais le jeu d'enregistrement calculé par
SP1
END
J'ai penser appeller SP1 dans une fonction utilisateur UDF1 et utiliser
UDF1
dans SP2 comme suit, le résultat de l'appel de l'UDF est une erreur "Only functions and extended stored procedures can be executed from within a function." :
CREATE PROCEDURE dbo.SP1 @retCursor CURSOR VARYING OUTPUT AS BEGIN DECLARE @strSQL nvarchar(255)
-- ici plein de traitements aboutissant à un truc du genre... SET @strSQL = 'SET @retCursor = CURSOR FOR SELECT identifiant FROM MaTable1' EXEC (@strSQL) END
CREATE FUNCTION dbo.UDF1 RETURNS @retTable TABLE(identifiant bigint primary key) AS BEGIN DECLARE @crRetIds CURSOR DECLARE @retId bigint
EXECUTE dbo.SP1, @crRetIds OUTPUT
FETCH NEXT FROM @crRetIds INTO @retId
WHILE @@FETCH_STATUS = 0 BEGIN
INSERT @retTable (identifiant) VALUES (@retId)
FETCH NEXT FROM @crRetIds INTO @retId END
CLOSE @crRetIds DEALLOCATE @crRetIds
RETURN
END
CREATE PROCEDURE dbo.SP2 AS BEGIN
SELECT * FROM MaTable2 WHERE MonChamp2 IN (dbo.UDF1()) END