He insert (simplificado) en un procedimiento almacenado de la siguiente

SET ROWCOUNT 100

WHILE(1=1)
BEGIN

  INSERT INTO table1
  SELECT *
  FROM table2
  WHERE some_condition
  -- EDIT: Realized forgot to include this following vital line that is causing issue
  SET @var = @var + @@ROWCOUNT    

  -- @@ROWCOUNT now takes on a value of 1, which will cause the following IF check to fail even when no lines are inserted

  IF(@@ROWCOUNT = 0)
  BEGIN
    BREAK
  END

END

Pero la cuestión es, después de cualquier operación, incluso cuando no hay más filas que se adapte a mi some_condition, @@ROWCOUNT es igual a 1, no 0.

¿Cómo puedo romper ese bucle cuando hay 0 filas que devuelve la coincidencia de mi some_condition?

  • Cuando usted dice que esto es «simplificado», podría el código real tienen nada en entre el INSERTO y la prueba de @@ROWCOUNT que podría haber puesto el valor de @@ROWCOUNT? Podría ser más seguro para capturar el valor de @@ROWCOUNT en una variable int inmediatamente después de la INSERCIÓN y el uso de esa variable en la prueba. No estoy seguro acerca de Sybase, pero en SQL Server SET ROWCOUNT ha quedado obsoleta y se recomienda el uso de SELECT TOP (100)…
  • El código que has publicado ha EMPEZAR y con los dos Extremos, por lo que el SI y el DESCANSO están fuera de su bucle while. Cómo sobre la publicación de código que funciona?
InformationsquelleAutor czchlong | 2013-03-22

5 Comentarios

  1. 7

    El «set» instrucción crea un recuento de filas de la 1. Lo que usted debe hacer es guardar inmediatamente @@ROWCOUNT en un @rowCount variable y el uso que var más tarde.

    declare @rowCount int
    
    WHILE(1=1)
    BEGIN
    
      INSERT INTO table1
      SELECT *
      FROM table2
      WHERE some_condition
      -- EDIT: Realized forgot to include this following vital line that is causing issue
      SET @rowCount = @@ROWCOUNT
      SET @var = @var + @rowCount    
    
      -- @@ROWCOUNT now takes on a value of 1, which will cause the following IF check to fail even when no lines are inserted
    
      IF(@rowCount = 0)
      BEGIN
        BREAK
      END
    
    END

    También, usted puede simplificar mediante el establecimiento de @rowCount -1 inicialmente y cambiando el tiempo de la condición de @rowCount <> 0. El condicional ROMPER dejará de ser necesaria.

    • Por alguna razón, si yo store @@ROWCOUNT en otra, entonces esa variable siempre tendrán un valor de 1. Creo que el SET declaración es la culpa.
    • en este ejemplo, si @rowCount es 1, entonces un registro ha sido insertado en la tabla1. No hay manera alrededor de ella.
  2. 0

    Una solución alternativa. Esto comprueba cada iteración para ver si el ID del último registro insertado ha cambiado o no. Si no ha cambiado, que indica que no hay registros se agregaron que la iteración.

    SET ROWCOUNT 100
    declare @id int;
    WHILE(1=1)
    
      INSERT INTO table1
      SELECT *
      FROM table2
      WHERE some_condition
    
      IF(@id= @@identity)
      BEGIN
        BREAK
      END
      set @id = @@identity;
    END
    • Lo siento, pero yo no lo entiendo en absoluto. Usted tiene SET @ID = @@IDENTITY pero de verificación para @ID = @@IDENTITY? Podría por favor explicar?
    • Respuesta actualizada-
  3. 0

    Pruebe estas soluciones:

    1ª solución

    Utilizando @@ROWCOUNT en el bucle de la condición.

    SET ROWCOUNT 100
    
      INSERT INTO table1
      SELECT *
      FROM table2
      WHERE some_condition  
    
    
    WHILE(@@ROWCOUNT > 0)
    BEGIN
    
      INSERT INTO table1
      SELECT *
      FROM table2
      WHERE some_condition  
    
    END

    2º solition

    Utilizando goto.

    SET ROWCOUNT 100
    
    WHILE(1=1)
    BEGIN
    
      INSERT INTO table1
      SELECT *
      FROM table2
      WHERE some_condition
    
      IF(@@ROWCOUNT = 0)
      BEGIN
        goto label
      END
    
    END
    
    label1:
    print 'After lopp'
    • Hola Parado, actualmente estoy usando algo similar a la segunda solución, pero el problema es @@ROWCOUNT no será 0 después de la eliminación de la condición, que en lugar de tener un valor de 1.
    • No veo delete declaración en su pregunta.
    • Lo siento, me refería a la insert declaración.
    • Desea freno de un bucle después de insertar una fila?
  4. 0

    Creo que se debe utilizar select para obtener el @@rowcount en una variable. intente esto:

    declare @number_of_rows int    
    
    SET ROWCOUNT 100
    
    WHILE(1=1)
    BEGIN
    
      INSERT INTO table1
      SELECT *
      FROM table2
      WHERE some_condition
    
      SELECT @number_of_rows[email protected]@ROWCOUNT
    
      IF (@number_of_rows = 0)
      BEGIN
         BREAK
      END
    END
    • Hola Ofir gracias por responder. Me acabo de dar cuenta que me perdí una parte vital de la línea después de mi insert declaración de que estoy seguro de que la configuración de @@ROWCOUNT a 1.
  5. -6

    Solución implementada similar a Moho, sino que se utiliza SELECT en lugar de SET para almacenar @@ROWCOUNT.

    • set @var = something es el mismo que select @var = something
    • también, te agradecería la respuesta y upvote como era mi solución 😉
    • Tal vez lo es, pero no obtengo los mismos resultados.
    • Usted debe haber aceptado la otra respuesta, o lo que se explica exactamente cuál es la diferencia entre ellos fue, y lo que salió mal con el otro. Parece que simplemente no entendía Moho o tecleado mal.
    • Esta bastante no explica nada en absoluto… @Moho soluciones parece mejor…

Dejar respuesta

Please enter your comment!
Please enter your name here