Blog de Portekoi : Programmation et Astuces

Programmation Cobol, Php, Asp, Java et DotNet…

[SQL Server] : Retourner une valeur depuis un EXEC via sp_executesql

J’ai dernièrement été confronté à un petit dilemme : générer dynamiquement une requête SQL et en récupérer un résultat dans une variable.

Au début, j’étais parti sur cette solution :

[cc lang= »sql »]
Declare @sql nvarchar(500)
Declare @count int

–On initialise
Set @sql =  »
Set @count = 0

–Est-ce que la table existe? Si oui, on la supprime
if exists(SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = ‘Share’
AND TABLE_NAME = ‘table_test’)
Drop table[Share].[table_test]

— On la crée
create table [Share].[table_test](
[id] [bigint],
[value] varchar(15)
)

–On insert deux lignes
insert into [Share].[table_test] VALUES (1, ‘aaaa’)
insert into [Share].[table_test] VALUES (2, ‘aaaa’)

— On construit la requête
Set @sql = ‘set @count = (select count(*) from [Share].[table_test] where id = 1)’
exec sp_executesql @sql

Select @count
[/cc]

Mais ce code génère une erreur :

Msg 137, Niveau 15, État 1, Ligne 1
La variable scalaire « @count » doit être déclarée.

C’est tout à fait normal car dans ce cas, la variable @count n’est pas dans le même « scope » que l’exécute.

Pour contourner cela, il faudrait faire ainsi :

[cc lang= »sql »]
–(…)
— On construit la requête
Set @sql = ‘Declare @count int ‘
Set @sql = @sql + ‘set @count = 0 ‘
Set @sql = @sql + ‘set @count = (select count(*) from [Share].[table_test] where id = 1)’
[/cc]

Mais là encore, impossible de récupérer la valeur de notre « count(*) ».

Voici la solution :

[cc lang= »sql »]
Declare @sql nvarchar(500)
Declare @count int

–On initialise
Set @sql =  »
Set @count = 0

–Est-ce que la table existe? Si oui, on la supprime
if exists(SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = ‘Share’
AND TABLE_NAME = ‘table_test’)
Drop table[Share].[table_test]

— On la crée
create table [Share].[table_test](
[id] [bigint],
[value] varchar(15)
)

–On insert deux lignes
insert into [Share].[table_test] VALUES (1, ‘aaaa’)
insert into [Share].[table_test] VALUES (2, ‘aaaa’)

— On construit la requête
Set @sql = @sql + ‘select @count = count(*) from [Share].[table_test] where id = 1′
exec sp_executesql @sql, N’@count int out’, @count out

Select @count –retourne ‘1’
[/cc]

J’obtiens bien ‘1’ dans ma variable @count. Si vous utilisez un ‘cursor’, n’oubliez pas de réinitialiser votre compteur.

Les commentaires sont fermés.