SQL Server - llamada de funciones definidas del usuario en una select con condiciones

 
Vista:

llamada de funciones definidas del usuario en una select con condiciones

Publicado por Pablo Almada (19 intervenciones) el 13/11/2019 20:09:53
Hola

Quisiera preguntarle si existe una manera de llamar a una función definida por el usuario u otra con un condicional dependiendo de un valor dentro de un select
Habia escuchado de Case... Else pero creo que no sirve me parece para llamada de funciones. El if puede servir pero no se puede usar en select.

Por ejemplo

1
2
3
Select CASE WHEN valor = 'I' THEN DATOSPAGOS(parametro)
ELSE DATOSFACTURAS(parametro)
END

Vuelvo a repetir en el ejemplo quise intentar hacer eso pero creo que case no puede llamar a una funcion u otra dependiendo de una condición..

Me pueden ayudar. Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
Responder
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

llamada de funciones definidas del usuario en una select con condiciones

Publicado por Isaias (4558 intervenciones) el 14/11/2019 00:24:56
Pues si se puede, yo hice este ejercicio:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE FUNCTION dbo.udf_ReturnLetter(@Myletter varchar(1))
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN
 IF @Myletter = 'a'
	RETURN 1
 
  RETURN 2
END
 
 
declare @Myletter char(1) = 'b';
select case when @Myletter = 'a' then dbo.udf_ReturnLetter(@Myletter)
								 else dbo.udf_ReturnLetter(@Myletter) end
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

llamada de funciones definidas del usuario en una select con condiciones

Publicado por Pablo Almada (19 intervenciones) el 14/11/2019 01:43:44
Gracias por responder. No me refiero a un select case, sino a un Select de una consulta, por ejemplo:

1
2
3
4
5
SELECT codigo, descripcion, importe
     case when = 'I' then  dbo.factura  --llamo a una funcion de usuario
              else dbo.pago  -- llamo a otra funcion de usuario
    end
FROM.....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Francisco
Val: 73
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

llamada de funciones definidas del usuario en una select con condiciones

Publicado por Francisco (29 intervenciones) el 14/11/2019 18:46:43
Hola

Claro que puedes llamar a una funcion u otra dependiendo de una condicion siempre y cuando devuelva el mismo tipo de datos, en el ejemplo que muestras el CASE esta mal contruido

Hay dos formas:

1
2
3
4
5
6
SELECT codigo, descripcion, importe
    CASE valor
        WHEN 'I' THEN  dbo.factura  --llamo a una funcion de usuario
                 ELSE dbo.pago  -- llamo a otra funcion de usuario
    END AS resultado
FROM.....

la otra forma

1
2
3
4
5
6
SELECT codigo, descripcion, importe
    CASE
        WHEN valor = 'I' THEN  dbo.factura  --llamo a una funcion de usuario
                 ELSE dbo.pago  -- llamo a otra funcion de usuario
    END AS resultado
FROM.....


Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

llamada de funciones definidas del usuario en una select con condiciones

Publicado por Pablo Almada (19 intervenciones) el 14/11/2019 22:59:22
Hola Francisco

Hice tal come me escribio en la consulta con la condicion y si se cumple ejecutando una funcion de usuario de tabla y si no se cumple ejecutando otra funcion de usuario de tabla , pero me sale este error:

Cannot find either column "dbo" or the user-defined function or aggregate "dbo.fCfdiDatosfacturaXml", or the name is ambiguous.

Esperando su ayuda. Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

llamada de funciones definidas del usuario en una select con condiciones

Publicado por Pablo Almada (19 intervenciones) el 15/11/2019 19:38:53
Hola

Estoy intentando ejecutar funciones de usuario de tabla como le decia antes pero me aparece este error:

Cannot find either column "dbo" or the user-defined function or aggregate "dbo.fCfdiDatosfacturaXml", or the name is ambiguous.

Pruebo con otras funciones de usuario y me sale el mismo error. No sé que pueda estar pasando. Nombre ambiguos ya probe cambiando el nombre y me pasa lo mismo. Uso la base correcta también donde desarrolle las funciones. Permiso de usuario si es asi como hago para desahilibar y me permita ejecutar las funciones de usuario.

Esperando una respueta. Desde ya gracias .
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

llamada de funciones definidas del usuario en una select con condiciones

Publicado por Isaias (4558 intervenciones) el 15/11/2019 20:05:34
Con el permiso de Francisco

¿Es SQL SERVER de MICROSOFT?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

llamada de funciones definidas del usuario en una select con condiciones

Publicado por Pablo Almada (19 intervenciones) el 15/11/2019 20:20:05
Si es Sql Server de Microsoft.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

llamada de funciones definidas del usuario en una select con condiciones

Publicado por Pablo Almada (19 intervenciones) el 15/11/2019 21:32:23
SI el gestor de base detos que estoy usando es Sql Server de Microsoft. Si me pueden seguir ayudando. Desde ya gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

llamada de funciones definidas del usuario en una select con condiciones

Publicado por Isaias (4558 intervenciones) el 15/11/2019 23:57:41
¿Que valor regresa tu funcion?, en el RETURN

¿Puedes mostrar el codigo de tu funcion?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

llamada de funciones definidas del usuario en una select con condiciones

Publicado por Pablo Almada (19 intervenciones) el 16/11/2019 16:06:58
Hola este el codigo

Para la consulta general donde llama a las funciones de usuario de tabla pongo la mas sencilla. Las funciones de usuario tienen como parámetro un campo que tiene una archivo xml. Ese campo proviene de la tabla dace.ComprobanteCFDI. Este es el código:

1
2
3
4
5
6
7
select com.FECHA, com.TOTAL, com.METODOPAGO,
		CASE com.TIPOCOMPROBANTE
        WHEN 'I' THEN dbo.fCfdiDatosFacturasXml(com.archivoXML)  --llamo a una funcion de usuario
 
                 ELSE dbo.fCfdiDatosPagosXml(com.archivoXML)  -- llamo a otra funcion de usuario
		END
from dace.ComprobanteCFDI as com

A continuación pongo el codigo de unas de las funciones de usuario. No pongo las dos porque hacen lo mismo solo que una tiene mas elementos que la otra. Se trata de una función que devuelve los elementos de un archivo xml como una tabla para que en la salida o el esultado de la consulta se visualize de esa manera como campos de tabla. El código es:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
IF OBJECT_ID ('dbo.fCfdiDatosFacturasXml') IS NOT NULL
   drop function dbo.fCfdiDatosFacturasXml
go
 
create function dbo.fCfdiDatosFacturasXml(@archivoXml xml)returns table
--Propósito. Obtiene los datos de la factura electrónica
--Usado por. vwCfdTransaccionesDeVenta
--Requisitos. CFDI
--25/10/17 jcf Creación cfdi 3.3
--25/01/18 jcf Agrega receptorRfc
--returns table
return(
	WITH XMLNAMESPACES('http://www.sat.gob.mx/TimbreFiscalDigital' as "tfd",
						'http://www.sat.gob.mx/cfd/3' as "cfdi")
 
	SELECT
	@archivoXml.value('(//tfd:TimbreFiscalDigital/@Version)[1]', 'varchar(5)') [version],
	@archivoXml.value('(//tfd:TimbreFiscalDigital/@UUID)[1]', 'varchar(50)') UUID,
	@archivoXml.value('(//tfd:TimbreFiscalDigital/@FechaTimbrado)[1]', 'varchar(20)') FechaTimbrado,
	@archivoXml.value('(//tfd:TimbreFiscalDigital/@RfcProvCertif)[1]', 'varchar(20)') RfcPAC,
	@archivoXml.value('(//tfd:TimbreFiscalDigital/@Leyenda)[1]', 'varchar(150)') Leyenda,
	@archivoXml.value('(//tfd:TimbreFiscalDigital/@SelloCFD)[1]', 'varchar(8000)') SelloCFD,
	@archivoXml.value('(//tfd:TimbreFiscalDigital/@NoCertificadoSAT)[1]', 'varchar(20)') NoCertificadoSAT,
	@archivoXml.value('(//tfd:TimbreFiscalDigital/@SelloSAT)[1]', 'varchar(8000)') SelloSAT,
	@archivoXml.value('(//@Sello)[1]', 'varchar(8000)') Sello,
	@archivoXml.value('(//@NoCertificado)[1]', 'varchar(20)') NoCertificado,
	@archivoXml.value('(//@FormaPago)[1]', 'varchar(50)') FormaPago,
	@archivoXml.value('(//@MetodoPago)[1]', 'varchar(21)') MetodoPago,
	@archivoXml.value('(//cfdi:Receptor/@Rfc)[1]', 'varchar(15)') receptorRfc,
	@archivoXml.value('(//cfdi:Receptor/@UsoCFDI)[1]', 'varchar(4)') UsoCFDI,
	@archivoXml.value('(//cfdi:CfdiRelacionados/@TipoRelacion)[1]', 'varchar(4)') TipoRelacion,
	@archivoXml.value('(//cfdi:CfdiRelacionado/@UUID)[1]', 'varchar(60)') UUIDrelacionado,
	--AGREGO CAMPOS
	@archivoXml.value('(//cfdi:Concepto/@ClaveProdServ)[1]', 'varchar(8)')ClaveProdServ,
	@archivoXml.value('(//cfdi:Concepto/@Importe)[1]', 'varchar(10)')Importe,
	@archivoXml.value('(//cfdi:Traslado/@Importe)[1]', 'varchar(10)')ImpuestoValorAgregado,
	@archivoXml.value('(//cfdi:Traslado/@TasaOCuota)[1]', 'varchar(10)')TasaCuota
	)
	go
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar