Estoy tratando de lograr algo similar a un para cada uno, donde me gustaría tomar los ID de una declaración de selección devuelta y usar cada uno de ellos.
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
Por el momento tengo algo parecido a lo anterior, pero recibo el error:
Nombre de columna no válido 'idx'.
Alguien podria
sql-server
tsql
Pomster
fuente
fuente
idx
está en@Practitioner
noPractitioner
. La mayoría de las veces, existen alternativas superiores basadas en conjuntos para un enfoque para cada uno; si muestra lo que hace con el valor de la fila, tal vez se le pueda sugerir una alternativa.--Do something with Id here
es, es probable que podamos mostrarle cómo resolver este problema sin ningún bucle o cursores. En la mayoría de los casos, desea utilizar una solución basada en conjuntos, ya que así es como SQL Server está optimizado para funcionar. Recorrer y tratar una fila a la vez ciertamente tiene su lugar, pero sospecho que no es así.Respuestas:
Parece que quieres usar a
CURSOR
. Aunque la mayoría de las veces es mejor usar una solución basada en un conjunto, hay algunas veces donde aCURSOR
es la mejor solución. Sin saber más sobre su problema real, no podemos ayudarlo más que eso:fuente
Supongamos que la columna PractitionerId es única, entonces puede usar el siguiente ciclo
fuente
Su selección de conteo y selección máxima deben ser de su variable de tabla en lugar de la tabla real
fuente
Esto generalmente (casi siempre) funciona mejor que un cursor y es más simple:
fuente
Diría que todo probablemente funciona, excepto que la columna
idx
no existe realmente en la tabla de la que está seleccionando. Tal vez quisiste seleccionar entre@Practitioner
:porque eso está definido en el código anterior así:
fuente
La siguiente línea es incorrecta en su versión:
(Falta la @)
Puede ser una idea cambiar su convención de nomenclatura para que las tablas sean más diferentes.
fuente
Aunque los cursores generalmente se consideran un mal horrible, creo que este es un caso para el cursor FAST_FORWARD: lo más cercano que puede llegar a FOREACH en TSQL.
fuente
Se me ocurrió una forma muy efectiva, (creo) legible de hacer esto.
Aquí está el código. Lo siento, está usando mis nombres de variables en lugar de los de la pregunta.
fuente
Aquí está una de las mejores soluciones.
Podemos acceder o podemos hacer cualquier cosa en el cuerpo del bucle y podemos acceder al idx definiéndolo dentro de la definición de la tabla.
fuente
Hice un procedimiento que ejecuta un
FOREACH
conCURSOR
para cualquier tabla.Ejemplo de uso:
El resultado es 2 selecciones para cada fila. La sintaxis
UPDATE
y la rupturaFOREACH
se escriben en las sugerencias.Este es el código de proceso:
fuente