SQL Server - Consulta condicional que devuelve varios campos de tabla de una función

 
Vista:

Consulta condicional que devuelve varios campos de tabla de una función

Publicado por Pablo Almada (19 intervenciones) el 18/11/2019 19:48:47
Hola

Tengo una consulta general que de acuerdo a una condicion(case when else)llamara a un función de usuario u otro
Cada funcion de usuario recibe como parametro un campo de otra tabla llamada prueba que contiene un archivo xml.. Cada funcion de usuario retorna una tabla con varios campos.

Mi consulta gerneral que llama a las funciones de usuario lo pude crear pero solo me trae un solo campo y no me sirve. Como esta hecho son subconsultas, pero si no lo hago como subconsultas tambien me da un error.

Reptio si lo hago como subconsulta solo me trae un campo y no me sirve.

Si no lo expreso como subconsultas me da un error como lo habia expresado en otra consulta anterior en este foro

A continuación escribo los codigos:

Consulta general con subconsultas en los case, solo retorna una campo y no varios. No me sirve.

1
2
3
4
5
6
7
select com.cod,com.tic,
    CASE com.tic
        WHEN 'I' THEN (Select * from dbo.fCfdiDatosFacturasXml(com.arc)) --llamo a una funcion
 
        ELSE (Select * from dbo.fCfdiDatosPagosXml(com.arc))-- llamo a otra funcion de usuario
    END
from prueba as com


Consulta general sin subconsultas en los case. Me da un error: No se encuentra la columna 'dbo' o la función definida por el usuario o agregado 'dbo.fCfdiDatosFacturasXml'; o bien, el nombre es ambiguo.

1
2
3
4
5
6
7
8
select com.cod,com.tic,
    CASE com.tic
    WHEN 'I' THEN dbo.fCfdiDatosFacturasXml(com.arc) --llamo a una funcion de usuario
 
        ELSE dbo.fCfdiDatosPagosXml(com.arc)-- llamo a otra funcion de usuario
 
    END
from prueba as com


Ese es el código de una de las funciones de usuario de tabla:

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

Me puede ayudar. Me esta costando encontrar las solución. Desde ya gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder