salida recorrer procedimiento parametros ejemplos ejemplo ejecutar cursores con almacenado sql sql-server sql-server-2005 tsql

recorrer - procedimiento almacenado sql server select



¿Cómo se puede iterar sobre los resultados del procedimiento almacenado desde dentro de otro procedimiento almacenado... sin cursores? (7)

Inserte los resultados del proceso almacenado en una tabla temporal y únase a la tabla que desea actualizar:

INSERT INTO #WorkTable EXEC usp_WorkResults UPDATE DataTable SET Flag = Whatever FROM DataTable INNER JOIN #WorkTable ON DataTable.Ket = #WorkTable.Key

No estoy seguro de si esto es algo que debería hacer en T-SQL o no, y estoy bastante seguro de que utilizar la palabra ''iterar'' era incorrecto en este contexto, ya que nunca debe iterar nada en sql. Debería ser una operación basada en conjunto, ¿correcto? De todos modos, aquí está el escenario:

Tengo un proceso almacenado que devuelve muchos identificadores únicos (resultados de columna única). Estos identificadores son las claves principales de los registros en otra tabla. Necesito establecer un indicador en todos los registros correspondientes en esa tabla.

¿Cómo hago esto sin el uso de cursores? ¡Debería ser fácil para ustedes, gurús sql!


Puede usar una tabla temporal o una variable de tabla con una columna adicional:

DECLARE @MyTable TABLE ( Column1 uniqueidentifer, ..., Checked bit ) INSERT INTO @MyTable SELECT [...], 0 FROM MyTable WHERE [...] DECLARE @Continue bit SET @Continue = 1 WHILE (@Continue) BEGIN SELECT @var1 = Column1, @var2 = Column2, ... FROM @MyTable WHERE Checked = 1 IF @var1 IS NULL SET @Continue = 0 ELSE BEGIN ... UPDATE @MyTable SET Checked = 1 WHERE Column1 = @var1 END END

Editar: En realidad, en tu situación una unión será mejor; el código anterior es una iteración sin cursor, que es excesiva para su situación.


Si actualiza a SQL 2008, puede pasar los parámetros de la tabla, creo. De lo contrario, está atascado con una tabla temporal global o creando una tabla permanente que incluye una columna para algún tipo de ID de proceso para identificar qué llamada al procedimiento almacenado es relevante.

¿Cuánto espacio tiene para cambiar el procedimiento almacenado que genera los ID? Podría agregar código allí para manejarlo o tener un parámetro que le permita marcar las filas opcionalmente cuando se llame.


Una solución fea sería hacer que su procedimiento devuelva el "siguiente" id cada vez que se llame utilizando la otra tabla (o algún indicador en la tabla existente) para filtrar las filas que ya ha devuelto


Esto puede no ser el más eficiente, pero crearía una tabla temporal para contener los resultados del proceso almacenado y luego usar eso en una combinación contra la tabla objetivo. Por ejemplo:

CREATE TABLE #t (uniqueid int) INSERT INTO #t EXEC p_YourStoredProc UPDATE TargetTable SET a.FlagColumn = 1 FROM TargetTable a JOIN #t b ON a.uniqueid = b.uniqueid DROP TABLE #t


También puede cambiar el proceso almacenado a una función definida por el usuario que devuelve una tabla con sus identificadores únicos. Puede unirse directamente a la UDF y tratarla como una tabla que evita tener que crear la tabla temporal adicional explícitamente. Además, puede pasar parámetros a la función cuando la está llamando, lo que la convierte en una solución muy flexible.

CREATE FUNCTION dbo.udfGetUniqueIDs () RETURNS TABLE AS RETURN ( SELECT uniqueid FROM dbo.SomeWhere ) GO UPDATE dbo.TargetTable SET a.FlagColumn = 1 FROM dbo.TargetTable a INNER JOIN dbo.udfGetUniqueIDs() b ON a.uniqueid = b.uniqueid

Editar: Esto funcionará en SQL Server 2000 y hasta ...


Use tablas temporales o una variable de tabla (está usando SS2005).

Aunque, eso no es anidable: si un proceso almacenado usa ese método, entonces no puede convertir ese resultado en una tabla temporal.