Ver Mensaje Individual
  #10 (permalink)  
Antiguo 12/05/2008, 02:47
estibbons
 
Fecha de Ingreso: abril-2008
Mensajes: 6
Antigüedad: 16 años
Puntos: 0
Re: Cursor con parámetros en procedimiento almacenado

Quizás lo veas mejor con código, el método que utilicé es más o menos este:

CREATE PROCEDURE [dbo].[Prueba]
@Texto1 VARCHAR(20),
@Texto2 VARCHAR(20),
@Texto3 VARCHAR(20)
AS
BEGIN
DECLARE @sSQL NVARCHAR(2048)
DECLARE @sWhere NVARCHAR(1024)

DECLARE @NIF NVARCHAR(14)
DECLARE @Nombre NVARCHAR(40)
DECLARE @Cantidad1 INT
DECLARE @Cantidad2 INT
DECLARE @Cantidad3 INT

-- Tabla temporal que contendrá los registros que vamos a procesar
CREATE TABLE #TablaTmp1 (
ClaveTT1 INT IDENTITY(1,1),
NIF NVARCHAR(14),
Nombre NVARCHAR(40),
)

-- Tabla temporal para guardar los datos calculados
CREATE TABLE #TablaTmp2 (
NIF NVARCHAR(14),
Nombre NVARCHAR(40),
Cantidad1 INT,
Cantidad2 INT,
Cantidad3 INT
)

-- Se calcula la cláusula Where según los parámetros pasados al procedimiento
SET @sWhere = ''

IF @Texto1 <> ''
IF @sWhere <> ''
SET @sWhere = @sWhere + ' AND '
SET @sWhere = '(Texto1 LIKE ''%' + @Texto1 + ''')'

IF @Texto2 <> ''
IF @sWhere <> ''
SET @sWhere = @sWhere + ' AND '
SET @sWhere = '(Texto2 LIKE ''%' + @Texto2 + ''')'

IF @Texto3 <> ''
IF @sWhere <> ''
SET @sWhere = @sWhere + ' AND '
SET @sWhere = '(Texto3 LIKE ''%' + @Texto3 + ''')'

-- Se calcula la cláusula INSERT INTO
SET @sSQL = 'INSERT INTO #TablaTmp1'
SET @sSQL = @sSQL + ' (NIF, Nombre)'
SET @sSQL = @sSQL + ' SELECT NIF, Nombre'
SET @sSQL = @sSQL + ' FROM Personas'
IF @sWhere <> ''
SET @sSQL = @sSQL + ' WHERE ' + @sWhere

EXEC (@sSQL)

-- Bucle que lee los registros de la tabla temporal 1 para hacer los
-- cálculos oportunos y guardar los datos obtenidos en la tabla
-- temporal2
WHILE EXISTS (SELECT ClaveTT1 FROM #TablaTmp1)
BEGIN

SELECT TOP 1
@ClaveTT1 = ClaveTT1,
@NIF = NIF,
@Nombre = Nombre
FROM #TablaTmp1

-- Llamadas a los procedimientos y funciones que realizan los
-- cálculos complejos:

SET @Cantidad1 = FuncionCalculo1(@NIF)
SET @Cantidad2 = FuncionCalculo2(@NIF)
SET @Cantidad3 = FuncionCalculo3(@NIF)


INSERT INTO #TablaTmp2
(NIF, Nombre, Cantidad1, Cantidad2, Cantidad3)
VALUES (
@NIF,
@Nombre,
@Cantidad1,
@Cantidad2,
@Cantidad3
)

DELETE #TablaTmp1
WHERE ClaveTT1 = @ClaveTT1

END

SELECT NIF,
Nombre,
Cantidad1,
Cantidad2,
Cantidad3
FROM #TablaTmp2
ORDER BY NIF

DROP TABLE #TablaTmp2
DROP TABLE #TablaTmp1

RETURN @@ROWCOUNT

END