Parcourir les enregistrements d'une requête dynamique
2 réponses
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, ...)
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
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
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:%238tlDTgmDHA.2652@TK2MSFTNGP09.phx.gbl...
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, ...)
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
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 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
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 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:%238tlDTgmDHA.2652@TK2MSFTNGP09.phx.gbl...
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, ...)
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 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, ...)