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

Accéder au jeu d'enregistrement d'une procédure stockée

1 réponse
Avatar
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

Comment arriver à mon but...

Merci

Alain

1 réponse

Avatar
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