intente nunca bucle, trabajar en conjuntos de datos.
puede insertar, actualizar, eliminar varias filas a la vez. aquí en una inserción de ejemplo de varias filas:
INSERT INTO YourTable
(col1, col2, col3, col4)
SELECT
cola, colb+Colz, colc, @X
FROM ....
LEFT OUTER JOIN ...
WHERE...
Al mirar un lazo, vea lo que hizo dentro de él. Si solo se trata de inserciones/eliminaciones/actualizaciones, vuelva a escribir para usar comandos individuales. Si hay IF, vea si pueden ser enunciados CASE o DONDE las condiciones en inserciones/eliminaciones/actualizaciones. Si es así, elimine el bucle y use los comandos de configuración.
He tomado bucles y los reemplacé con los comandos de configuración y reduje el tiempo de ejecución de minutos a unos pocos segundos. Realicé procedimientos con muchos bucles anidados y llamadas a procedimientos y mantuve los bucles (era imposible usar solo inserciones/eliminaciones/actualizaciones), pero quité el cursor, y he visto menos bloqueo/bloqueo y un aumento de rendimiento masivo también. Aquí hay dos métodos de bucle que son mejores que los bucles del cursor ...
si tiene que bucle, más de un conjunto hacer algo como esto:
--this looks up each row for every iteration
DECLARE @msg VARCHAR(250)
DECLARE @hostname sysname
--first select of currsor free loop
SELECT @hostname= min(RTRIM(hostname))
FROM master.dbo.sysprocesses (NOLOCK)
WHERE hostname <> ''
WHILE @hostname is not null
BEGIN
set @msg='exec master.dbo.xp_cmdshell "net send '
+ RTRIM(@hostname) + ' '
+ 'testing "'
print @msg
--EXEC (@msg)
--next select of cursor free loop
SELECT @hostname= min(RTRIM(hostname))
FROM master.dbo.sysprocesses (NOLOCK)
WHERE hostname <> ''
and hostname > @hostname
END
si tiene un conjunto razonable de artículos (no 100.000) para recorrer usted puede hacer esto:
--this will capture each Key to loop over
DECLARE @msg VARCHAR(250)
DECLARE @From int
DECLARE @To int
CREATE TABLE #Rows
(
RowID int not null primary key identity(1,1)
,hostname varchar(100)
)
INSERT INTO #Rows
SELECT DISTINCT hostname
FROM master.dbo.sysprocesses (NOLOCK)
WHERE hostname <> ''
SELECT @From=0,@[email protected]@ROWCOUNT
WHILE @From<@To
BEGIN
SET @[email protected]+1
SELECT @msg='exec master.dbo.xp_cmdshell "net send '
+ RTRIM(hostname) + ' '
+ 'testing "'
FROM #Rows WHERE [email protected]
print @msg
--EXEC (@msg)
END