J'essaie de réaliser quelque chose comme un for-each, où je voudrais prendre les identifiants d'une instruction select retournée et utiliser chacun d'eux.
DECLARE @i int
DECLARE @PractitionerId int
DECLARE @numrows int
DECLARE @Practitioner TABLE (
idx smallint Primary Key IDENTITY(1,1)
, PractitionerId int
)
INSERT @Practitioner
SELECT distinct PractitionerId FROM Practitioner
SET @i = 1
SET @numrows = (SELECT COUNT(*) FROM Practitioner)
IF @numrows > 0
WHILE (@i <= (SELECT MAX(idx) FROM Practitioner))
BEGIN
SET @PractitionerId = (SELECT PractitionerId FROM @Practitioner WHERE idx = @i)
--Do something with Id here
PRINT @PractitionerId
SET @i = @i + 1
END
Pour le moment, j'ai quelque chose qui ressemble à ce qui précède, mais j'obtiens l'erreur:
Nom de colonne non valide "idx".
Quelqu'un pourrait-il
sql-server
tsql
Pomster
la source
la source
idx
n'est@Practitioner
pasPractitioner
. Il existe le plus souvent des alternatives basées sur des ensembles supérieures à une approche pour chaque, si vous montrez ce que vous faites avec la valeur de ligne, une alternative peut peut-être être suggérée.--Do something with Id here
c'est, il est probable que nous puissions vous montrer comment résoudre ce problème sans boucles ni curseurs. Dans la plupart des cas, vous souhaitez utiliser une solution basée sur des ensembles, car c'est ainsi que SQL Server est optimisé pour fonctionner. Boucler et traiter une ligne à la fois a certainement sa place, mais je soupçonne que ce n'est pas ça.Réponses:
Vous semblez vouloir utiliser un fichier
CURSOR
. Bien que la plupart du temps, il soit préférable d'utiliser une solution basée sur un ensemble, il y a des moments où aCURSOR
est la meilleure solution. Sans en savoir plus sur votre vrai problème, nous ne pouvons pas vous aider plus que cela:la source
Supposons que la colonne PractitionerId soit unique, vous pouvez alors utiliser la boucle suivante
la source
Le nombre de sélection et le maximum de sélection doivent provenir de votre variable de table au lieu de la table réelle
la source
Cela fonctionne généralement (presque toujours) mieux qu'un curseur et est plus simple:
la source
Je dirais que tout fonctionne probablement, sauf que la colonne
idx
n'existe pas réellement dans le tableau dans lequel vous sélectionnez. Peut-être que vous vouliez choisir parmi@Practitioner
:car c'est défini dans le code ci-dessus comme ça:
la source
La ligne suivante est erronée dans votre version:
(Manque le @)
Cela pourrait être une idée de changer votre convention de dénomination afin que les tables soient plus différentes.
la source
Bien que les curseurs soient généralement considérés comme un mal horrible, je pense que c'est un cas pour le curseur FAST_FORWARD - la chose la plus proche que vous pouvez obtenir de FOREACH dans TSQL.
la source
J'ai fait une procédure qui exécute un
FOREACH
avecCURSOR
pour n'importe quelle table.Exemple d'utilisation:
Le résultat est 2 sélections pour chaque ligne. La syntaxe de
UPDATE
et casser leFOREACH
sont écrites dans les indices.Voici le code proc:
la source
J'ai trouvé un moyen très efficace, (je pense) lisible de le faire.
Voici le code. Désolé, il utilise mes noms de variables au lieu de ceux de la question.
la source
Voici l'une des meilleures solutions.
Nous pouvons accéder ou nous pouvons faire n'importe quoi dans le corps de la boucle et nous pouvons accéder à l'idx en le définissant dans la définition de la table.
la source