Reputation: 779
CREATE FUNCTION [dbo].[udfGetNextEntityID]
()
RETURNS INT
AS
BEGIN
;WITH allIDs AS
(
SELECT entity_id FROM Entity
UNION SELECT entity_id FROM Reserved_Entity
)
RETURN (SELECT (MAX(entity_id) FROM allIDs )
END
GO
SQL isn't my strong point, but I can't work out what I'm doing wrong here. I want the function to return the largest entity_id from a union of 2 tables. Running the script gives the error:
Incorrect syntax near the keyword 'RETURN'.
I looked to see if there was some restriction on using CTEs in functions but couldn't find anything relevant. How do I correct this?
Upvotes: 5
Views: 5947
Reputation: 1
create function tvfFormatstring (@string varchar(100))
returns @fn_table table
(id int identity(1,1),
item int)
as
begin
insert into @fn_table(item)
declare @result int
set @string = @string+'-'
;with cte (start,number)
as
(
select 1 as start , CHARINDEX('-',@string,1) as number
union all
select number+1 as start , CHARINDEX('-',@string,number+1) as number from cte
where number <= LEN(@string)
)
select @result = SUBSTRING(@string,start,number-start) from cte ;
return @result;
end
select * from tvfFormatstring ('12321-13542-15634')
Upvotes: -1
Reputation: 280252
While you can do it, why do you need a CTE here?
RETURN
(
SELECT MAX(entity_id) FROM
(
SELECT entity_id FROM dbo.Entity
UNION ALL
SELECT entity_id FROM dbo.Reserved_Entity
) AS allIDs
);
Also there is no reason to use UNION
instead of UNION ALL
since this will almost always introduce an expensive distinct sort operation. And please always use the schema prefix when creating / referencing any object.
Upvotes: 3
Reputation: 15139
You can not return the way your are doing from the function.
Make use of a local variable and return the same.
CREATE FUNCTION [dbo].[udfGetNextEntityID]()
RETURNS INT
AS
BEGIN
DECLARE @MaxEntityId INT;
WITH allIDs AS
(
SELECT entity_id FROM Entity
UNION SELECT entity_id FROM Reserved_Entity
)
SELECT @MaxEntityId = MAX(entity_id) FROM allIDs;
RETURN @MaxEntityId ;
END
GO
Upvotes: 1
Reputation: 1584
CREATE FUNCTION [dbo].[udfGetNextEntityID]()
RETURNS INT
AS
BEGIN
DECLARE @result INT;
WITH allIDs AS
(
SELECT entity_id FROM Entity
UNION SELECT entity_id FROM Reserved_Entity
)
SELECT @result = MAX(entity_id) FROM allIDs;
RETURN @result;
END
GO
Upvotes: 7