Todoexpertos.com
http://www.todoexpertos.com
La respuesta está en Internet
Información de la pregunta
Título: Ayuda con Store Procedure
Experto: iislas
Valoración: 3
Fecha: 07/07/2008


Ayuda con Store Procedure
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.      

Ayuda con Store Procedure
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([url=mailto:'%'+@nombre+'%','%']'%'+@nombre+'%','%'[/url]) and paterno like coalesce([url=mailto:'%'+@Paterno+'%','%']'%'+@Paterno+'%','%'[/url]) and materno like coalesce([url=mailto:'%'+@Materno+'%']'%'+@Materno+'%'[/url], '%') and departamento like coalasce('%'+cast(@Departamento as varchar(10)) +'%','%')   end  

Ayuda con Store Procedure
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.

Ayuda con Store Procedure
Los valores que van en IN(), son fijos o variables.

Ayuda con Store Procedure
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.

Ayuda con Store Procedure
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.

Ayuda con Store Procedure
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'  [b][i]-- Puede ser 0, 1 ó NULL [/i][/b]IF NOT @CodeSec IS NULL SET @Parametro = @Parametro + N' AND CodeSec = @CodeSec'  [b][i]-- Puede ser 1 al 5 ó NULL [/i][/b]IF NOT @FechaIni IS NULL SET @Parametro = @Parametro + N' AND Fecha >= @FechaIni' --[b][i] Fecha inicio ó NULL[/i][/b] IF NOT @FechaFin IS NULL SET @Parametro = @Parametro + N' AND Fecha <= @FechaFin' --  [b][i]Fecha Final ó NULL [/i][/b]IF NOT @CodeRaiz IS NULL SET @Parametro = @Parametro + N' AND CodeEquipo = IN ( Select CodeEquipo From ListaEq)'  [i][b]-- La lista de Equipos Hijos de un Equipo Padre (incluido) ó NULL [/b][/i] 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   [b][i]<==== Aquí me sale error,  no se como hacerlo[/i][/b] @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.

Pregunta finalizada. Valoración: 3
Iislas: Gracias por la ayuda que me has brindado, me ha servido mucho.


Volver al mensaje
http://www.todoexpertos.com/categorias/tecnologia-e-internet/bases-de-datos/sql-server/respuestas/1875163/ayuda-con-store-procedure