在SQL用户定义函数中使用公用表表达式时出错

时间:2013-10-01 15:55:47

标签: sql sql-server sql-function

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是否有一些限制,但找不到任何相关的东西。我该如何纠正?

4 个答案:

答案 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)

你无法从函数中返回你的行为。

Error

使用局部变量并返回相同的内容。

 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')