5
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

4 に答える 4

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
于 2013-10-01T15:58:29.233 に答える
3

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.

于 2013-10-01T16:12:45.863 に答える
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
于 2013-10-01T16:00:36.000 に答える