Inicio > SQL Server > iislas > Ayuda con Store Procedure

Ayuda con Store Procedure

Experto:
Usuario:
Fecha: 17/07/2008
Valoración: (3,00 sobre 5) Categoría: SQL Server
07/07/2008
luisxxi, usuario preguntando en SQL Server
Usuario
Hola iislas:
Molestandote de nuevo, por favor si pudieras ayudarme, mira por ejemplo si tuviera una Tabla llamemosla Personal con los siguientes campos:
IdPersonal (int, no null)
Nombre(varchar(100),no null)
Apellido(varchar(100), no null)
FechaNac(smalldatetime, no null)
Activo(bit, no null)
IdDepartamento(int, no null)
y quisiera hacer una  un SP pero el que pueda realizar diferentes tipos de consulta, por ejemplo:
Todos lo que estan activos,
Todos los que nacieron entre un rango de fechas y estan activos,
Todos los que pertenecen a un departamento y estan activos,
Todos los registros
Estoy haciendo una aplicación en VB.Net y desde ahi le puedo mandar una colsulta a la BD y lo condiciono si es que he seleccionado los filtros que deseo darle, pe. si quiero los activos, le agrego al WHERE un AND Activo = True, si quiero adicionalmente que pertenezcan a un Dpto le agrego un AND IdDepartamento = XXX, y si no simplemente no agrego nada al WHERE, así me funciona, pero hacerlo con un SP en SQL Server 2005 Express no se como hacerlo, o tengo que crear un SP diferente para tipo de consulta que quiero.
Si podrias ayudarme.
 
 
 
07/07/2008
luisxxi, experto respondiendo en SQL Server
Experto
No, puedes crear un SP y dependiendo de los parametros, si traen dato o no, puedes hacer un COALESCE, ejemplo:
create procedure ups_ConsultaVariable
@Nombre varchar(50),
@Paterno varchar(50),
@Materno varchar(50),
@Departamento int
as
   begin
     set nocount on
     select * from personal where nombre like coalesce('%'+@nombre+'%','%') and paterno like coalesce('%'+@Paterno+'%','%') and materno like coalesce('%'+@Materno+'%', '%') and departamento like coalasce('%'+cast(@Departamento as varchar(10)) +'%','%')
  end
 
08/07/2008
luisxxi, usuario preguntando en SQL Server
Usuario
iislas,
 
Probé con el Coalesce y si me responde, incluso con las fechas, que lo hago así:
AND Fecha >= Coalesce (@FecIni, 0) AND Fecha <= Coalesce (@FecFin, GetDate())
Pero también necesito hacer algunas consulta filtrando  pe. el IdPersonal entre una relación de Id, osea usando: AND IdPersonal IN (Relación de Ids), le estoy dando vueltas y no sé como hacerlo con el Coalesce.
Gracias de antemano.
08/07/2008
luisxxi, experto respondiendo en SQL Server
Experto
Los valores que van en IN(), son fijos o variables.
09/07/2008
luisxxi, usuario preguntando en SQL Server
Usuario
Estos valores son variables,  pues se usa para filtar de acuerdo a un nodo de un árbol, para lo cual uso una CTE recursiva y obtengo los códigos de todos los hijos de este nodo y los paso como la lista del IN.
Saludos.
09/07/2008
luisxxi, experto respondiendo en SQL Server
Experto
No, pues si son variables, no le veo de otra, que utilizar QUERY DINAMICO, en verdad que no encuentro otra solucion, o bien, colocar esas variables en una tabla temporal.
10/07/2008
luisxxi, usuario preguntando en SQL Server
Usuario
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.
17/07/2008
luisxxi, usuario preguntando en SQL Server
Usuario
Iislas:
Gracias por la ayuda que me has brindado, me ha servido mucho.
Enlaces patrocinados