19 08 2014
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.
Requêtes préparées avec Mysqli Ajouter un Timer personnalisable sur un WordPress
Les commentaires sont fermés.