|
Que tal iislas:
También estuve probando con una query dinámica, pero el problema que se me presenta es que necesito usar una CTE recursiva para recuperar una lista de códigos de los hijos de un nodo, pero no sé como hacerle para usar uns CTE como parte de una SP, me sale error. El código es el siguiente:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Lucho
-- Create date:
-- Description: Entrega una lista de trabajos pendientes de Equipos.
-- =============================================
ALTER PROCEDURE Lista_Pendientes_SP
-- Add the parameters for the stored procedure here
@Estado Bit,
@CodeSec Tinyint,
@FechaIni DateTime,
@FechaFin DateTime,
@CodeRaiz Int
AS
DECLARE @Parametro nvarchar(1000)
DECLARE @Consulta nvarchar(2000)
SET @Parametro =N' WHERE 1=1'
IF NOT @Estado IS NULL
SET @Parametro = @Parametro + N' AND Estado = @Estado' -- Puede ser 0, 1 ó NULL
IF NOT @CodeSec IS NULL
SET @Parametro = @Parametro + N' AND CodeSec = @CodeSec' -- Puede ser 1 al 5 ó NULL
IF NOT @FechaIni IS NULL
SET @Parametro = @Parametro + N' AND Fecha >= @FechaIni' -- Fecha inicio ó NULL
IF NOT @FechaFin IS NULL
SET @Parametro = @Parametro + N' AND Fecha <= @FechaFin' -- Fecha Final ó NULL
IF NOT @CodeRaiz IS NULL
SET @Parametro = @Parametro + N' AND CodeEquipo = IN ( Select CodeEquipo From ListaEq)' -- La lista de Equipos Hijos de un Equipo Padre (incluido) ó NULL
SET @Consulta =
'SELECT *
FROM Pendientes ' + @Parametro
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
WITH ListaEq (Contenedor, CodeEquipo)
AS
(
-- Anchor member definition
SELECT e.Contenedor, e.CodeEquipo
FROM dbo.Equipos AS e
WHERE CodeEquipo = @CodeRaiz
UNION ALL
-- Recursive member definition
SELECT e.Contenedor, e.CodeEquipo
FROM dbo.Equipos AS e
INNER JOIN ListaEq AS d
ON e.Contenedor = d.CodeEquipo
)
-- Insert Statement that executes the CTE
Exec sp_executesql <==== Aquí me sale error, no se como hacerlo
@Consulta,
N'@Estado Bit, @CodeSec Tinyint, @FechaIni DateTime, @FechaFin DateTime, @CodeRaiz Int',
@Estado, @CodeSec, @FechaIni, @FechaFin, @CodeRaiz
END
La verdad no tengo mucha experiencia en SQL, por eso creo que esta mal al usar una CTE como parte de un SP. Como te dije anteriormente haciendo con Coalesce sin usar la condición del IN me sale bien (filtrando por fecha, sección y estado usando coalesce dentro de la sintaxis del Select en el CTE), por eso creo que voy a hacer 02 SP, uno en el cual no se use el Filtrado por Equipos y el otro donde si lo use, y lo llamaré desde mi aplicación en VB.Net de acuerdo a lo que necesite. O existe alguna manera de usar esta CTE en este SP.
Saludos.
|