CTE'S y funciones en línea

13/10/2004 - 10:08 por SqlRanger | Informe spam
¿Es posible usar CTE's dentro de la definición de una función en lína?

Lo pregunto porque no he sido capaz de hacerlo, me da error de sintaxis, y
la documentación de la beta 2 no dice nada acerca de si está soportado o no.

he intentado hacerlo más o menos así:

CREATE FUNCTION fnNombreFuncion ( @Param int )
RETURNS TABLE
AS
RETURN (
WITH NombreCTE ( lista de campos )
AS
(
SELECT
FROM ...
WHERE Campo = @Param
UNION ALL
SELECT ...
FROM
)
SELECT * FROM NombreCTE
)

Si alguien ha conseguido hacerlo, ¿Podría poner un ejemplo con la base de
datos AdventureWorks?

Con un procedimiento almacenado, con una función tabular de múltiples
sentencias y con una vista no he tenido problemas en meter una CTE, pero no
así con las funciones en línea.

Gracias

Jesús López
MVP

Preguntas similare

Leer las respuestas

#1 Eladio Rincón
13/10/2004 - 12:08 | Informe spam
Hola Jesús :-),
quitale los parentesis del return;

drop function dbo.udfSalesOrderDetail
go
create function dbo.udfSalesOrderDetail
(
@SalesOrderId int
)
returns table
as
return

with CTE
as
(
select * from Sales.SalesOrderDetail
where SalesOrderId = @SalesOrderId
)
select
*
from
CTE
go

select * from dbo.udfSalesOrderDetail ( 43659 )

Un abrazo,

Eladio Rincón
SQL Server MVP
Associate Mentor
Solid Quality Learning Iberoamericana
http://www.SolidQualityLearning.com


"SqlRanger" wrote in message
news:
¿Es posible usar CTE's dentro de la definición de una función en lína?

Lo pregunto porque no he sido capaz de hacerlo, me da error de sintaxis, y
la documentación de la beta 2 no dice nada acerca de si está soportado o


no.

he intentado hacerlo más o menos así:

CREATE FUNCTION fnNombreFuncion ( @Param int )
RETURNS TABLE
AS
RETURN (
WITH NombreCTE ( lista de campos )
AS
(
SELECT
FROM ...
WHERE Campo = @Param
UNION ALL
SELECT ...
FROM
)
SELECT * FROM NombreCTE
)

Si alguien ha conseguido hacerlo, ¿Podría poner un ejemplo con la base de
datos AdventureWorks?

Con un procedimiento almacenado, con una función tabular de múltiples
sentencias y con una vista no he tenido problemas en meter una CTE, pero


no
así con las funciones en línea.

Gracias

Jesús López
MVP


Respuesta Responder a este mensaje
#2 SqlRanger
13/10/2004 - 12:17 | Informe spam
Gracias Eladio, así da gusto.

Un abrazo

Jesús
Respuesta Responder a este mensaje
#3 Gustavo Larriera [MVP]
13/10/2004 - 16:00 | Informe spam
Sí, se pueden usar CTE en funciones multi-sentencia, acá hay un ejemplo de
los BOL de Yukon Beta 1.

CREATE FUNCTION fn_FindReports (@InEmpId INTEGER)
RETURNS @retFindReports TABLE (
EmployeeID int primary key,
LastName nvarchar(50) NOT NULL,
FirstName nvarchar(50) NOT NULL,
ManagerID int,
Title nvarchar(50)
)
/*Returns a result set that lists all the employees who report to given
employee directly or indirectly.*/
AS
BEGIN
WITH Emp(EmployeeID, LastName, FirstName, ManagerID, Title) AS
(
SELECT e.EmployeeID, e.LastName, e.FirstName, e.ManagerID, e.Title
FROM Employee e
WHERE e.EmployeeID = @InEmpID
UNION ALL
SELECT Employee.EmployeeID, Employee.LastName,
Employee.FirstName, Employee.ManagerID, Employee.Title
FROM Employee
INNER JOIN Emp ON Emp.EmployeeID = Employee.ManagerID
)
INSERT @retFindReports
SELECT EmployeeID, LastName, FirstName, ManagerID, Title
FROM Emp
RETURN
END
GO

Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and confers
no rights.
"SqlRanger" wrote in message
news:
¿Es posible usar CTE's dentro de la definición de una función en lína?

Lo pregunto porque no he sido capaz de hacerlo, me da error de sintaxis, y
la documentación de la beta 2 no dice nada acerca de si está soportado o
no.

he intentado hacerlo más o menos así:

CREATE FUNCTION fnNombreFuncion ( @Param int )
RETURNS TABLE
AS
RETURN (
WITH NombreCTE ( lista de campos )
AS
(
SELECT
FROM ...
WHERE Campo = @Param
UNION ALL
SELECT ...
FROM
)
SELECT * FROM NombreCTE
)

Si alguien ha conseguido hacerlo, ¿Podría poner un ejemplo con la base de
datos AdventureWorks?

Con un procedimiento almacenado, con una función tabular de múltiples
sentencias y con una vista no he tenido problemas en meter una CTE, pero
no
así con las funciones en línea.

Gracias

Jesús López
MVP


Respuesta Responder a este mensaje
#4 Eladio Rincón
13/10/2004 - 16:13 | Informe spam
Hola Gux,

ya, Jesús preguntaba sobre funciones en linea no sobre funciones
multi-sentencia; parece ser que se ha añadido la posibilidad en beta2 ;-)

Saludos,


Eladio Rincón
SQL Server MVP
Associate Mentor
Solid Quality Learning Iberoamericana
http://www.SolidQualityLearning.com


"Gustavo Larriera [MVP]" wrote in message
news:
Sí, se pueden usar CTE en funciones multi-sentencia, acá hay un ejemplo de
los BOL de Yukon Beta 1.

CREATE FUNCTION fn_FindReports (@InEmpId INTEGER)
RETURNS @retFindReports TABLE (
EmployeeID int primary key,
LastName nvarchar(50) NOT NULL,
FirstName nvarchar(50) NOT NULL,
ManagerID int,
Title nvarchar(50)
)
/*Returns a result set that lists all the employees who report to given
employee directly or indirectly.*/
AS
BEGIN
WITH Emp(EmployeeID, LastName, FirstName, ManagerID, Title) AS
(
SELECT e.EmployeeID, e.LastName, e.FirstName, e.ManagerID, e.Title
FROM Employee e
WHERE e.EmployeeID = @InEmpID
UNION ALL
SELECT Employee.EmployeeID, Employee.LastName,
Employee.FirstName, Employee.ManagerID, Employee.Title
FROM Employee
INNER JOIN Emp ON Emp.EmployeeID = Employee.ManagerID
)
INSERT @retFindReports
SELECT EmployeeID, LastName, FirstName, ManagerID, Title
FROM Emp
RETURN
END
GO

Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and confers
no rights.
"SqlRanger" wrote in message
news:
> ¿Es posible usar CTE's dentro de la definición de una función en lína?
>
> Lo pregunto porque no he sido capaz de hacerlo, me da error de sintaxis,


y
> la documentación de la beta 2 no dice nada acerca de si está soportado o
> no.
>
> he intentado hacerlo más o menos así:
>
> CREATE FUNCTION fnNombreFuncion ( @Param int )
> RETURNS TABLE
> AS
> RETURN (
> WITH NombreCTE ( lista de campos )
> AS
> (
> SELECT
> FROM ...
> WHERE Campo = @Param
> UNION ALL
> SELECT ...
> FROM
> )
> SELECT * FROM NombreCTE
> )
>
> Si alguien ha conseguido hacerlo, ¿Podría poner un ejemplo con la base


de
> datos AdventureWorks?
>
> Con un procedimiento almacenado, con una función tabular de múltiples
> sentencias y con una vista no he tenido problemas en meter una CTE, pero
> no
> así con las funciones en línea.
>
> Gracias
>
> Jesús López
> MVP
>
>


Respuesta Responder a este mensaje
#5 Gustavo Larriera [MVP]
13/10/2004 - 16:20 | Informe spam
Aún no pude armar una VPC para poner el beta 2 :-(
Espero las novedades :-)

Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and confers
no rights.
"Eladio Rincón" wrote in message
news:O%23U%
Hola Gux,

ya, Jesús preguntaba sobre funciones en linea no sobre funciones
multi-sentencia; parece ser que se ha añadido la posibilidad en beta2 ;-)

Saludos,


Eladio Rincón
SQL Server MVP
Associate Mentor
Solid Quality Learning Iberoamericana
http://www.SolidQualityLearning.com


"Gustavo Larriera [MVP]" wrote in message
news:
Sí, se pueden usar CTE en funciones multi-sentencia, acá hay un ejemplo
de
los BOL de Yukon Beta 1.

CREATE FUNCTION fn_FindReports (@InEmpId INTEGER)
RETURNS @retFindReports TABLE (
EmployeeID int primary key,
LastName nvarchar(50) NOT NULL,
FirstName nvarchar(50) NOT NULL,
ManagerID int,
Title nvarchar(50)
)
/*Returns a result set that lists all the employees who report to given
employee directly or indirectly.*/
AS
BEGIN
WITH Emp(EmployeeID, LastName, FirstName, ManagerID, Title) AS
(
SELECT e.EmployeeID, e.LastName, e.FirstName, e.ManagerID, e.Title
FROM Employee e
WHERE e.EmployeeID = @InEmpID
UNION ALL
SELECT Employee.EmployeeID, Employee.LastName,
Employee.FirstName, Employee.ManagerID, Employee.Title
FROM Employee
INNER JOIN Emp ON Emp.EmployeeID = Employee.ManagerID
)
INSERT @retFindReports
SELECT EmployeeID, LastName, FirstName, ManagerID, Title
FROM Emp
RETURN
END
GO

Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and
confers
no rights.
"SqlRanger" wrote in message
news:
> ¿Es posible usar CTE's dentro de la definición de una función en lína?
>
> Lo pregunto porque no he sido capaz de hacerlo, me da error de
> sintaxis,


y
> la documentación de la beta 2 no dice nada acerca de si está soportado
> o
> no.
>
> he intentado hacerlo más o menos así:
>
> CREATE FUNCTION fnNombreFuncion ( @Param int )
> RETURNS TABLE
> AS
> RETURN (
> WITH NombreCTE ( lista de campos )
> AS
> (
> SELECT
> FROM ...
> WHERE Campo = @Param
> UNION ALL
> SELECT ...
> FROM
> )
> SELECT * FROM NombreCTE
> )
>
> Si alguien ha conseguido hacerlo, ¿Podría poner un ejemplo con la base


de
> datos AdventureWorks?
>
> Con un procedimiento almacenado, con una función tabular de múltiples
> sentencias y con una vista no he tenido problemas en meter una CTE,
> pero
> no
> así con las funciones en línea.
>
> Gracias
>
> Jesús López
> MVP
>
>






email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida