Voici comment je m'y prendrais :
Select Identity(int, 1,1) AS PK, DatabaseID
Into #T
From @databases
Declare @maxPK int;Select @maxPK = MAX(PK) From #T
Declare @pk int;Set @pk = 1
While @pk <= @maxPK
Begin
-- Get one record
Select DatabaseID, Name, Server
From @databases
Where DatabaseID = (Select DatabaseID From #T Where PK = @pk)
--Do some processing here
--
Select @pk = @pk + 1
End
[Edit] Parce que j'ai probablement omis le mot "variable" lorsque j'ai lu la question la première fois, voici une réponse mise à jour...
declare @databases table
(
PK int IDENTITY(1,1),
DatabaseID int,
Name varchar(15),
Server varchar(15)
)
-- insert a bunch rows into @databases
--/*
INSERT INTO @databases (DatabaseID, Name, Server) SELECT 1,'MainDB', 'MyServer'
INSERT INTO @databases (DatabaseID, Name, Server) SELECT 1,'MyDB', 'MyServer2'
--*/
Declare @maxPK int;Select @maxPK = MAX(PK) From @databases
Declare @pk int;Set @pk = 1
While @pk <= @maxPK
Begin
/* Get one record (you can read the values into some variables) */
Select DatabaseID, Name, Server
From @databases
Where PK = @pk
/* Do some processing here */
/* ... */
Select @pk = @pk + 1
End
3 votes
Bien que je ne sois pas sûr du problème que vous voyez avec l'approche ci-dessus ; Voyez si cela vous aide databasejournal.com/features/mssql/article.php/3111031
5 votes
Pourriez-vous nous donner la raison pour laquelle vous voulez itérer sur les lignes, d'autres solutions qui ne nécessitent pas d'itération peuvent exister (et qui sont plus rapides dans la plupart des cas).
0 votes
Je suis d'accord avec pop... on peut ne pas avoir besoin d'un curseur selon la situation. mais il n'y a aucun problème à utiliser des curseurs si on en a besoin.
0 votes
wiki.lessthandot.com/index.php/Curseurs et comment les éviter
0 votes
J'étais en train de lire sur le bouclage d'une variable de table avec un curseur et je suis tombé sur ceci. Y a-t-il un avantage à utiliser l'itération de sélection et de mise à jour décrite ci-dessous au lieu d'un curseur ?
0 votes
Question similaire ici : stackoverflow.com/questions/61967/
3 votes
Vous n'indiquez pas pourquoi vous voulez éviter un curseur. Sachez qu'un curseur pourrait être la façon la plus simple d'itérer. Vous avez peut-être entendu dire que les curseurs sont "mauvais", mais c'est en réalité l'itération sur des tableaux qui est mauvaise par rapport aux opérations basées sur des ensembles. Si vous ne pouvez pas éviter l'itération, un curseur peut être la meilleure solution. Le verrouillage est un autre problème avec les curseurs, mais il n'est pas pertinent lorsque vous utilisez une variable de table.
1 votes
Utiliser un curseur n'est pas votre uniquement mais si vous n'avez aucun moyen d'éviter une approche ligne par ligne, ce sera votre meilleure option. Les CURSEURS sont une construction intégrée qui est plus efficace et moins sujette aux erreurs que votre propre boucle WHILE. La plupart du temps, il vous suffit d'utiliser la fonction
STATIC
pour supprimer la revérification constante des tables de base et le verrouillage qui sont présents par défaut et qui font que la plupart des gens croient à tort que les CURSEURS sont mauvais. @JacquesB très proche : revérifier pour voir si la ligne de résultat existe toujours + le verrouillage sont les problèmes. EtSTATIC
résout généralement ce problème :-).