sql server如何调用自定义的表值函数

时间:2022-11-30 13:29:45
create  function [dbo].[f_split](@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(a varchar(100))
--实现split功能 的函数
as 
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>'\'
insert @temp values(@SourceSql)
return 
end

select * from  f_split(ab-cd-erf,‘-’)这样没有问题,
但调用select f_split(应用行业代码,';')   FROM [master].[dbo].[分列测试]会报错,'f_split' 不是可以识别的 内置函数名称。这样的自定义函数应该怎样调用?

9 个解决方案

#1


你用的是master库里面的函数,你把master去掉看看

#2


引用 1 楼 KanzakiOrange 的回复:
你用的是master库里面的函数,你把master去掉看看

没有用,还是报错'f_split' 不是可以识别的 内置函数名称。

#3


你看看你新建的函数f_split是建在哪个库 在函数之前加上 数据库名称.dbo.f_split

#4


引用 3 楼 yoan2014 的回复:
你看看你新建的函数f_split是建在哪个库 在函数之前加上 数据库名称.dbo.f_split

这个我测试过了,加上数据库的名称也一样,mater库里面有这个函数,加上数据库名调用一样报错,我换到其他普通的库,报的错一样找不到列 "KJCG" 或用户定义的函数或聚合 "KJCG.dbo.f_split",或者名称不明确。

#5


引用 2 楼 sinat_25801249 的回复:
Quote: 引用 1 楼 KanzakiOrange 的回复:

你用的是master库里面的函数,你把master去掉看看

没有用,还是报错'f_split' 不是可以识别的 内置函数名称。


不好意思,粗心看错了,你定义的是一个表值函数哦,怎么能放在列名里面呢。

#6


引用 5 楼 KanzakiOrange 的回复:
Quote: 引用 2 楼 sinat_25801249 的回复:

Quote: 引用 1 楼 KanzakiOrange 的回复:

你用的是master库里面的函数,你把master去掉看看

没有用,还是报错'f_split' 不是可以识别的 内置函数名称。


不好意思,粗心看错了,你定义的是一个表值函数哦,怎么能放在列名里面呢。


那应该怎么调用,select *  FROM f_split(应用行业代码,';')  这样吗,那表名应该写在哪?

#7


引用 6 楼 sinat_25801249 的回复:
Quote: 引用 5 楼 KanzakiOrange 的回复:

Quote: 引用 2 楼 sinat_25801249 的回复:

Quote: 引用 1 楼 KanzakiOrange 的回复:

你用的是master库里面的函数,你把master去掉看看

没有用,还是报错'f_split' 不是可以识别的 内置函数名称。


不好意思,粗心看错了,你定义的是一个表值函数哦,怎么能放在列名里面呢。


那应该怎么调用,select *  FROM f_split(应用行业代码,';')  这样吗,那表名应该写在哪?


我看你是想用个拼接是吧?
那你可以试下这样写
select  *
   FROM [master].[dbo].[分列测试]  a 
   cross apply f_split(a.应用行业代码,';')  as b

#8


引用 7 楼 KanzakiOrange 的回复:
Quote: 引用 6 楼 sinat_25801249 的回复:

Quote: 引用 5 楼 KanzakiOrange 的回复:

Quote: 引用 2 楼 sinat_25801249 的回复:

Quote: 引用 1 楼 KanzakiOrange 的回复:

你用的是master库里面的函数,你把master去掉看看

没有用,还是报错'f_split' 不是可以识别的 内置函数名称。


不好意思,粗心看错了,你定义的是一个表值函数哦,怎么能放在列名里面呢。


那应该怎么调用,select *  FROM f_split(应用行业代码,';')  这样吗,那表名应该写在哪?


我看你是想用个拼接是吧?
那你可以试下这样写
select  *
   FROM [master].[dbo].[分列测试]  a 
   cross apply f_split(a.应用行业代码,';')  as b


确实是想要拼接,谢谢

#9


--看看这个函数的所有者是谁,一般是dbo
select dbo.f_split()

#1


你用的是master库里面的函数,你把master去掉看看

#2


引用 1 楼 KanzakiOrange 的回复:
你用的是master库里面的函数,你把master去掉看看

没有用,还是报错'f_split' 不是可以识别的 内置函数名称。

#3


你看看你新建的函数f_split是建在哪个库 在函数之前加上 数据库名称.dbo.f_split

#4


引用 3 楼 yoan2014 的回复:
你看看你新建的函数f_split是建在哪个库 在函数之前加上 数据库名称.dbo.f_split

这个我测试过了,加上数据库的名称也一样,mater库里面有这个函数,加上数据库名调用一样报错,我换到其他普通的库,报的错一样找不到列 "KJCG" 或用户定义的函数或聚合 "KJCG.dbo.f_split",或者名称不明确。

#5


引用 2 楼 sinat_25801249 的回复:
Quote: 引用 1 楼 KanzakiOrange 的回复:

你用的是master库里面的函数,你把master去掉看看

没有用,还是报错'f_split' 不是可以识别的 内置函数名称。


不好意思,粗心看错了,你定义的是一个表值函数哦,怎么能放在列名里面呢。

#6


引用 5 楼 KanzakiOrange 的回复:
Quote: 引用 2 楼 sinat_25801249 的回复:

Quote: 引用 1 楼 KanzakiOrange 的回复:

你用的是master库里面的函数,你把master去掉看看

没有用,还是报错'f_split' 不是可以识别的 内置函数名称。


不好意思,粗心看错了,你定义的是一个表值函数哦,怎么能放在列名里面呢。


那应该怎么调用,select *  FROM f_split(应用行业代码,';')  这样吗,那表名应该写在哪?

#7


引用 6 楼 sinat_25801249 的回复:
Quote: 引用 5 楼 KanzakiOrange 的回复:

Quote: 引用 2 楼 sinat_25801249 的回复:

Quote: 引用 1 楼 KanzakiOrange 的回复:

你用的是master库里面的函数,你把master去掉看看

没有用,还是报错'f_split' 不是可以识别的 内置函数名称。


不好意思,粗心看错了,你定义的是一个表值函数哦,怎么能放在列名里面呢。


那应该怎么调用,select *  FROM f_split(应用行业代码,';')  这样吗,那表名应该写在哪?


我看你是想用个拼接是吧?
那你可以试下这样写
select  *
   FROM [master].[dbo].[分列测试]  a 
   cross apply f_split(a.应用行业代码,';')  as b

#8


引用 7 楼 KanzakiOrange 的回复:
Quote: 引用 6 楼 sinat_25801249 的回复:

Quote: 引用 5 楼 KanzakiOrange 的回复:

Quote: 引用 2 楼 sinat_25801249 的回复:

Quote: 引用 1 楼 KanzakiOrange 的回复:

你用的是master库里面的函数,你把master去掉看看

没有用,还是报错'f_split' 不是可以识别的 内置函数名称。


不好意思,粗心看错了,你定义的是一个表值函数哦,怎么能放在列名里面呢。


那应该怎么调用,select *  FROM f_split(应用行业代码,';')  这样吗,那表名应该写在哪?


我看你是想用个拼接是吧?
那你可以试下这样写
select  *
   FROM [master].[dbo].[分列测试]  a 
   cross apply f_split(a.应用行业代码,';')  as b


确实是想要拼接,谢谢

#9


--看看这个函数的所有者是谁,一般是dbo
select dbo.f_split()