Agregar varias filas a una tabla con un procedimiento

Estoy tratando de ejecutar un procedimiento almacenado para agregar 3 libros consecutivos a una tabla...

Aquí está mi consulta...

ALTER PROCEDURE dbo.AddCards @cnt int   
AS 
BEGIN    
   while(@cnt < 810010010513) 
   begin 
      insert into prepaidbooks(sbarcode, sdescription, lServiceId, iQty, dblWashValue, dblBookPrice, lLocationId, lBookTypeId)  
      values(@cnt, 'Dealer Car Wash', 43, 1, 9, 0, 1, 7)  

      set @cnt = @cnt + 1  
    END 
END

No funciona correctamente... Aparece un cuadro que me pide que defina @CNT con en el cuadro de valor. Lo cambio a 810010010511 y me sale

no se puede convertir

si lo dejo me sale:

El procedimiento o función 'AddCards' espera el parámetro '@cnt', que no se proporcionó.

No hay filas afectadas.
(Se devolvieron 0 filas) @RETURN_VALUE = Finalizó la ejecución de [dbo].[AddCards].

Por favor, ayuda.

Muchas Gracias

preguntado el 12 de junio de 12 a las 21:06

Bienvenido a StackOverflow: si publica código, XML o muestras de datos, Por favor resalte esas líneas en el editor de texto y haga clic en el botón "ejemplos de código" ( { } ) en la barra de herramientas del editor para formatearlo y resaltarlo con sintaxis. Si publica mensajes de error, Por favor use las comillas en bloque (`" `) para formatear correctamente el mensaje de error.

2 Respuestas

810010010511 is demasiado grande para ver la int - ya sea use BIGINT o use un número más pequeño (int sube a 2147483648)

ALTER PROCEDURE dbo.AddCards
      @cnt BIGINT
AS 
BEGIN    
   WHILE (@cnt < 810010010513) 
   BEGIN 
      INSERT INTO dbo.prepaidbooks(sbarcode, sdescription, lServiceId, iQty, dblWashValue, dblBookPrice, lLocationId, lBookTypeId)  
      VALUES (@cnt, 'Dealer Car Wash', 43, 1, 9, 0, 1, 7)  

      SET @cnt = @cnt + 1  
    END 
END

Ahora debería poder ejecutar esto así:

EXECUTE dbo.AddCards @cnt = 810010010511 

y obtenga sus valores en la tabla.

Como nota al margen: "codificación dura" de un valor como WHILE (@cnt < 810010010513) en un procedimiento almacenado es una muy mala idea. No podrá reutilizar ese procedimiento almacenado para ningún otro caso.... al menos debe pasar en el "límite superior" para su @cnt como segundo parámetro para el procedimiento almacenado, algo como esto:

ALTER PROCEDURE dbo.AddCards
      @cnt BIGINT, @max BIGINT
AS 
BEGIN    
   WHILE (@cnt < @max) 
   BEGIN 
      INSERT INTO dbo.prepaidbooks(sbarcode, sdescription, lServiceId, iQty, dblWashValue, dblBookPrice, lLocationId, lBookTypeId)  
      VALUES (@cnt, 'Dealer Car Wash', 43, 1, 9, 0, 1, 7)  

      SET @cnt = @cnt + 1  
    END 
END

y luego ejecute su procedimiento almacenado algo como esto:

EXECUTE dbo.AddCards @cnt = 810010010511, @max = 810010010513

Respondido el 12 de junio de 12 a las 21:06

Sí, y cambie < a <= para que alcance su máximo. De lo contrario, se detiene 1 a continuación. - Shmewnix

Tengo una propuesta diferente en lugar de un bucle. Esto manejará alrededor de 2000 libros consecutivos si necesita más, puede agregar una unión cruzada. Tomando prestada la firma actualizada de @marc_s (y suponiendo que < 810010010513 realmente se suponía que era <=, ya que dijiste que querías 3 libros, no 2):

ALTER PROCEDURE dbo.AddCards
  @cnt BIGINT
AS
BEGIN
    SET NOCOUNT ON;

    --INSERT dbo.prepaidbooks
    --(
    --   sbarcode, sdescription, lServiceId, iQty, 
    --   dblWashValue, dblBookPrice, lLocationId, lBookTypeId
    --)  
    SELECT rn, 'Dealer Car Wash' --, 43, 1, 9, 0, 1, 7
    FROM 
    (
      SELECT TOP (CONVERT(INT, 810010010513 - (@cnt)) + 1) rn = 
        810010010513 - (ROW_NUMBER() OVER (ORDER BY [object_id]) - 1)
      FROM sys.all_objects
      ORDER BY [object_id]
    ) AS y
    ORDER BY rn;
END
GO

EXEC dbo.AddCards 810010010511;

Resultados:

810010010511  Dealer Car Wash
810010010512  Dealer Car Wash
810010010513  Dealer Car Wash

Cuando esté satisfecho con el resultado, descomente el INSERT parte (lo dejé fuera para que pueda probar la salida) y el resto de la SELECT lista (solo los dejé fuera por brevedad).

También le sugiero que cambie el nombre del parámetro; no es muy intuitivo. Estrictamente, no estás pasando un conteo; lo que realmente estás pasando es una especie de marcador de dónde quieres que comience la cuenta.

Respondido el 12 de junio de 12 a las 23:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.