SQL Server:不知道我的功能是否正确

时间:2018-03-07 23:31:57

标签: sql sql-server

我正在使用SQL Server Management Studio。

我创建了一个名为func_GetMenuItemsForMenu的函数,你将把这个函数传递给函数。该函数将找到菜单上的所有MenuItem。它会返回一张表。

CREATE FUNCTION [dbo].[func_GetMenuItemsForMenu] 

(

  @MenuItemMenuItemID NVARCHAR(200)

)

RETURNS TABLE

AS

   RETURN (

   SELECT Menu.MenuID FROM Menu, MenuItem

   WHERE MenuItem.MenuID LIKE @MenuItemMenuItemID + '%'

   AND MenuItem.MenuID = Menu.MenuID)

GO

我正在尝试创建一个名为func_GetMenuItemDescriptionForMenuItemID的函数  它应该在标题中按预期运行并将MenuItemID传递给函数并返回MenuItemDescription,一个标量(varchar)。

这是我到目前为止所拥有的。我不知道以下功能是否正确并且将如上所述执行?

CREATE FUNCTION [dbo].[func_GetMenuItemDescriptionForMenuItemID]
(  
 @MenuItemID nvarchar (200)   
)

RETURNS nvarchar (200)

AS

BEGIN    
  RETURN (SELECT TOP 5 MenuItemDescriptionText
          FROM MenuItem 
          WHERE MenuItemID = @MenuItemID)    
END

所有表/字段/关系都显示在下面的数据库图中,标题中ID为ID的所有字段均为int,其余为varchar。

如图所示,每个表中的字段MenuID是表格菜单字段MenuID的外键。同样,Table MenuItem中的Field MenuGrouID是Table MenuGroup中MenuGroupID的外键

Database Diagram

我需要使用这两个函数来创建一个SQL查询或存储过程,它使用函数调用来返回给定菜单上显示的所有菜单项的描述,并且在编写此查询时遇到问题以及看我的第二个功能是否符合标准

感谢您的投入。

3 个答案:

答案 0 :(得分:0)

你应该返回一个标量。 SELECT TOP 5...返回result set。您必须声明一个变量并将要查找的值分配给它。然后返回该变量。

CREATE FUNCTION [dbo].[func_GetMenuItemDescriptionForMenuItemID]
(  
 @MenuItemID nvarchar (200)   
)

RETURNS nvarchar (200)

BEGIN
     DECLARE @ReturnVariable NVARCHAR(200);
     SELECT @ReturnVariable = MenuItemDescriptionText FROM MenuItem WHERE MenuItemID = @MenuItemID;
     RETURN @ReturnVariable;
END

答案 1 :(得分:0)

CREATE FUNCTION [dbo].[func_GetMenuItemDescriptionForMenuItemID]
(  
 @MenuItemID nvarchar (200)   
)
RETURNS nvarchar (200)
AS
BEGIN    
  RETURN (SELECT MenuItemDescriptionText
          FROM MenuItem 
          WHERE MenuItemID = @MenuItemID)    
END

如何调用功能

将“1007”替换为您的商品ID

select [dbo].[func_GetMenuItemDescriptionForMenuItemID]('1007') 

答案 2 :(得分:0)

你定义了一个Scalar值函数(一个只返回一个值的函数),你想要的是一个Table值函数(一个返回多行的函数):

CREATE FUNCTION [dbo].[func_GetMenuItemDescriptionForMenuItemID]
(  
 @MenuItemID nvarchar (200)   
)

RETURNS @results TABLE(description nvarchar (200))

AS

BEGIN  
INSERT INTO @results(description)
  SELECT TOP 5 MenuItemDescriptionText
          FROM MenuItem 
          WHERE MenuItemID = @MenuItemID
  RETURN 
END

但是,当您使用MenuItemID时,您将只获得一个结果,因为这是您的主键。我想你想要的是根据MenuID选择,这是该表中的FK。如果你真的想通过MenuItemID,那么你可以SELECT MenuItemDescriptionText FROM MenuItem WHERE MenuItemID = @MenuItemID这是一个非常简单的查询,它不值得一个功能。