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

Parcourir les enregistrements d'une requête dynamique

2 réponses
Avatar
Alain DIART
Bonjour,

Je cherche au sein d'une procédure stockée à parcourir les enregistrement
retournés par une requete dynamique. Je ne trouve pas l'astuce (si toutefois
elle existe)...

j'ai ce genre de code

CREATE PROCEDURE dbo.MaProc
@tableName nvarchar(255) = ''
AS
BEGIN
DECLARE @strSQL varchar(255)
SET @strSQL = 'SELECT * FROM ' + @tableName
EXEC (@strSQL)
-- super, j'ai les bons résultats, mais :
-- 1. Je n'ai pas besoin de les retourner hors de la SP
-- 2. je veux utiliser ces résultats et faire un traitement itératif
dans cette SP sur ceux ci
END

J'ai essayé de définir un curseur sur l'EXEC (@strSQL), et pas mal d'autres
choses, mais ca a pas l'air supporté... Alors vers où dois-je me tourner
(tables temporaires, UDF, ...)

Merci

Alain

2 réponses

Avatar
Nicolas LETULLIER
Bonjour,

Par contre, il est possible de déclarer ton curseur dans le SQL dynamique et
l'utiliser en dehors.

Genre :

CREATE PROCEDURE dbo.MaProc
@tableName nvarchar(255) = ''
AS
BEGIN
DECLARE @strSQL varchar(255)
SET @strSQL = 'DECLARE cr_matable CURSOR FOR SELECT * FROM ' +
@tableName
EXEC (@strSQL)
OPEN cr_matable
...
..
CLOSE cr_matable
DEALLOCATE cr_matable
END

Nicolas.


"Alain DIART" <alain(nospamthanks)@cnsx.net> a écrit dans le message de
news:%
Bonjour,

Je cherche au sein d'une procédure stockée à parcourir les enregistrement
retournés par une requete dynamique. Je ne trouve pas l'astuce (si


toutefois
elle existe)...

j'ai ce genre de code

CREATE PROCEDURE dbo.MaProc
@tableName nvarchar(255) = ''
AS
BEGIN
DECLARE @strSQL varchar(255)
SET @strSQL = 'SELECT * FROM ' + @tableName
EXEC (@strSQL)
-- super, j'ai les bons résultats, mais :
-- 1. Je n'ai pas besoin de les retourner hors de la SP
-- 2. je veux utiliser ces résultats et faire un traitement itératif
dans cette SP sur ceux ci
END

J'ai essayé de définir un curseur sur l'EXEC (@strSQL), et pas mal


d'autres
choses, mais ca a pas l'air supporté... Alors vers où dois-je me tourner
(tables temporaires, UDF, ...)

Merci

Alain




Avatar
Patrice Scribe
Cf DECLARE CURSOR dans la doc en ligne. Cela permet de lire le résultat
ligne par ligne.

Exemple tiré de la doc :

L'exemple suivant montre comment les curseurs peuvent être imbriqués pour
produire des rapports complexes. Le curseur interne est déclaré pour chaque
auteur.
SET NOCOUNT ON

DECLARE @au_id varchar(11), @au_fname varchar(20), @au_lname varchar(40),
@message varchar(80), @title varchar(80)

PRINT "-------- Utah Authors report --------"

DECLARE authors_cursor CURSOR FOR
SELECT au_id, au_fname, au_lname
FROM authors
WHERE state = "UT"
ORDER BY au_id

OPEN authors_cursor

FETCH NEXT FROM authors_cursor
INTO @au_id, @au_fname, @au_lname

WHILE @@FETCH_STATUS = 0
BEGIN
PRINT " "
SELECT @message = "----- Books by Author: " +
@au_fname + " " + @au_lname

PRINT @message

-- Declare an inner cursor based
-- on au_id from the outer cursor.

DECLARE titles_cursor CURSOR FOR
SELECT t.title
FROM titleauthor ta, titles t
WHERE ta.title_id = t.title_id AND
ta.au_id = @au_id -- Variable value from the outer cursor

OPEN titles_cursor
FETCH NEXT FROM titles_cursor INTO @title

IF @@FETCH_STATUS <> 0
PRINT " <<No Books>>"

WHILE @@FETCH_STATUS = 0
BEGIN

SELECT @message = " " + @title
PRINT @message
FETCH NEXT FROM titles_cursor INTO @title

END

CLOSE titles_cursor
DEALLOCATE titles_cursor

-- Get the next author.
FETCH NEXT FROM authors_cursor
INTO @au_id, @au_fname, @au_lname
END

CLOSE authors_cursor
DEALLOCATE authors_cursor
GO

-------- Utah Authors report --------

----- Books by Author: Anne Ringer
The Gourmet Microwave
Is Anger the Enemy?

----- Books by Author: Albert Ringer
Is Anger the Enemy?
Life Without Fear

--

"Alain DIART" <alain(nospamthanks)@cnsx.net> a écrit dans le message de
news:%
Bonjour,

Je cherche au sein d'une procédure stockée à parcourir les enregistrement
retournés par une requete dynamique. Je ne trouve pas l'astuce (si


toutefois
elle existe)...

j'ai ce genre de code

CREATE PROCEDURE dbo.MaProc
@tableName nvarchar(255) = ''
AS
BEGIN
DECLARE @strSQL varchar(255)
SET @strSQL = 'SELECT * FROM ' + @tableName
EXEC (@strSQL)
-- super, j'ai les bons résultats, mais :
-- 1. Je n'ai pas besoin de les retourner hors de la SP
-- 2. je veux utiliser ces résultats et faire un traitement itératif
dans cette SP sur ceux ci
END

J'ai essayé de définir un curseur sur l'EXEC (@strSQL), et pas mal


d'autres
choses, mais ca a pas l'air supporté... Alors vers où dois-je me tourner
(tables temporaires, UDF, ...)

Merci

Alain