Sql 创建一个函数以返回电影名称

Sql 创建一个函数以返回电影名称,sql,sql-server,database,Sql,Sql Server,Database,作为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]

作为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
我们的想法是从这个函数中搜索一部电影的名字,但是选择[Movie_search]'star'会抛出以下错误:

Msg 102,15级,状态1,第28行 “星形”附近的语法不正确


首先,正如我在评论中提到的,如果发现多个胶片,该函数将导致错误,这是由于您用于分配@film值的方法。如果找到多个胶片,那么您将得到一个错误,告诉您子查询返回了多行

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

这看起来像这样:

创建函数dbo.Movie_Search@FilmName nvarchar255 返回表 作为回报 选择电影名称 从dbo.tblFilm 其中FilmName类似于N“%”+@FilmName+N“%”; 然后调用如下函数:

选择电影名称 来自dbo.Movie_SearchN'Star'MS;
您正在使用MS SQL Server吗?请用您正在使用的数据库标记您的问题。请编辑您的问题并包括一个演示您的问题的。这看起来像SqlServer,应该是一个表值函数-如何处理多个匹配?请说明如何使用该函数我建议将其从多行标量函数切换为内联表值函数;他们的表现要好得多。请注意,如果你发现不止一部电影,上面提到的内容也会失败,这部电影中的WHERE子句很容易在你的预期范围内。切换到iTVF的另一个原因,因为您不限于标量值。@Beni。这完全改变了你正在做的事情。表值函数与标量函数有很大不同。“毫无疑问,这也许能满足你的需要,但它似乎并不能真正回答你提出的问题。我完全不同意,”戈登林诺夫说。OP从注释中清楚地表明,它们需要多个值,这是标量函数无法做到的。再加上多行标量函数往往性能较差,这意味着使用iTVF是一个更好的解决方案。但是,如果OP确实想学习如何编写标量函数,我们当然可以向他们展示,这不适合他们在这里试图实现的情景,因此我认为,在另一个问题上,这会更好。当你的工具箱里有一把非常合适的螺丝刀时,用锤子拧螺丝是没有什么意义的;尤其是对这种语言的新手。从一开始就正确地教他们。