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不是我的强项,但我无法弄清楚我在这里做错了什么。我希望函数从2个表的并集中返回最大的entity_id。运行脚本会出现错误:
Incorrect syntax near the keyword 'RETURN'.
我查看在功能中使用CTE是否有一些限制,但找不到任何相关的东西。我该如何纠正?
答案 0 :(得分:7)
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
答案 1 :(得分:3)
虽然你能做到,但为什么你需要CTE?
RETURN
(
SELECT MAX(entity_id) FROM
(
SELECT entity_id FROM dbo.Entity
UNION ALL
SELECT entity_id FROM dbo.Reserved_Entity
) AS allIDs
);
此外,没有理由使用UNION
代替UNION ALL
,因为这几乎总会引入昂贵的不同排序操作。并please always use the schema prefix when creating / referencing any object。
答案 2 :(得分:1)
你无法从函数中返回你的行为。
使用局部变量并返回相同的内容。
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
答案 3 :(得分:-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')