【问题标题】:Create a function to return a movie name创建一个函数以返回电影名称
【发布时间】:2021-04-07 10:40:55
【问题描述】:

作为一个SQL新手,出于学习的目的,我成功创建了一个函数:

create function Movie_Search 
    (@FilmName as nvarchar(255))
returns nvarchar(255)
as
begin
    declare @Film nvarchar(255)

    select @Film = (select filmname 
                    from [dbo].[tblFilm]
                    where FilmName like '%'+@FilmName+'%')

    return @Film
end

这个想法是从这个函数中搜索电影的名字,但是select [Movie_Search]('star') 会抛出这个错误:

消息 102,第 15 级,状态 1,第 28 行
'star' 附近的语法不正确。

【问题讨论】:

  • 您使用的是 MS SQL Server 吗?
  • 用您正在使用的数据库标记您的问题。
  • 请编辑您的问题并包含一个Minimal, Reproducible Example 来证明您的问题。这看起来像 SqlServer,应该是一个表值函数——如何处理多个匹配项?
  • 请说明您是如何使用该功能的
  • 我真的建议将其从多行标量函数转换为内联表值函数;它们性能更高。请注意,如果您发现不止一部影片,上述内容也将失败,带有WHERE 子句的影片很容易在预期范围内。切换到 iTVF 的另一个原因,因为您不受标量值的限制。

标签: sql sql-server database


【解决方案1】:

首先,正如我在 cmets 中提到的,如果找到多个电影,此函数将导致错误,这是由于您使用分配 @Film 值的方法。如果找到多部电影,那么您将收到一条错误消息,告诉您子查询返回了多行。

相反,您应该在这里使用内联表值函数,它与处理多行一起,比多行标量函数更高效。

这看起来像这样:

CREATE FUNCTION dbo.Movie_Search (@FilmName nvarchar(255))
RETURNS TABLE
AS RETURN
    SELECT FilmName
    FROM dbo.tblFilm
    WHERE FilmName LIKE N'%' + @FilmName + N'%';

然后你会像下面这样调用函数:

SELECT FilmName
FROM dbo.Movie_Search(N'Star') MS;

【讨论】:

  • @Beni 。 . .这完全改变了你正在做的事情。表值函数与标量函数完全不同。毫无疑问,它可能会满足您的需求,但它似乎并不能真正回答您提出的问题。
  • 我完全不同意,@GordonLinoff。 OP 从 cmets 清楚地表明,他们期望多个值,这是标量函数无法做到的。此外,多线标量函数的性能也往往较低,这意味着迁移到 iTVF 是一个更好的解决方案。
  • 如果但是,OP 确实想学习如何编写标量函数,我们当然可以向他们展示,但是,它不适合他们的场景正在尝试在这里实现(所以在我看来,在不同的问题上会更好)。当你的工具箱里有一把非常合适的螺丝刀时,用锤子拧螺丝没有什么意义。特别是对于刚接触这门语言的人。教他们正确开始。
猜你喜欢
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 2021-12-17
  • 2016-10-12
  • 2019-01-12
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
相关资源
最近更新 更多