找不到列“dbo”或用户定义的函数或聚合“dbo.FN_Split”,或者名称不明确

时间:2013-12-18 07:01:18

标签: sql-server tsql sql-server-2005 user-defined-functions

我有以下功能,接受CSV&除界仪和拆分

ALTER FUNCTION [dbo].[FN_Split] (@String varchar(max), @Delimiter char(1))      
returns @temptable TABLE (orderId int,items varchar(max))        
as        
begin        
   declare @idx int   
   declare @i int=0     
   declare @slice varchar(8000)        
   declare @orderId int = 0 --<added a counter

    select @idx = 1        
        if len(@String)<1 or @String is null  return        

   while @idx!= 0        
   begin        
       set @idx = charindex(@Delimiter,@String)        
       if @idx!=0        
           set @slice = left(@String,@idx - 1)        
       else        
          set @slice = @String        

       if(len(@slice)>0)   
           insert into @temptable(orderId, Items) values(@orderId, @slice)        
       set @orderId = @orderId+1 --<increment the counter

       set @String = right(@String,len(@String) - @idx)        
       if len(@String) = 0 break        
   end    
return        
end

&安培;像这样的存储过程使用上述功能&amp;将结果插入数据库:

ALTER PROCEDURE dbo.StoredProcedure3
(
 --@tableName nvarchar(max),
 @p_SourceText nvarchar(max),
 @p_Delimeter nvarchar(100)=','
)

AS
BEGIN
DECLARE @sql nvarchar(max)
--select * from fn_ParseText2Table(@p_SourceText, @p_Delimeter)
--insert into Person values (@sql)
declare @i int=0
DECLARE @max int=3

while @i<=@max
begin
if @i=0
begin
set @sql='insert into Person values( select items from'+dbo.FN_Split(@p_SourceText,  
 @p_Delimeter)+ 'as where orderId ='+0+')'
end

 else
  begin
   if @i=(@max-1)
    begin
 set @sql=@sql+'UNION select items from'+ dbo.FN_Split(@p_SourceText,
                  @p_Delimeter)+' where orderId ='+@i+')'
    end
 else
  begin
   set @sql=@sql+'UNION select items from'+ dbo.FN_Split(@p_SourceText,        
                 @p_Delimeter)+ 'where orderId ='+@i+') UNION'
      end
   end
   set @i=@i+1
end
END 

但执行程序后我得到以下错误: 找不到列“dbo”或用户定义的函数或聚合“dbo.FN_Split”,或者名称不明确。 没有行影响。 (0行返回)

请帮助摆脱它...

3 个答案:

答案 0 :(得分:1)

首先,确保您在正确的数据库中运行了创建脚本。

其次,正如@astander开始提到的那样,你正在错误地使用函数结果。

您的函数返回一个表,而不是一个值。您需要在sql语句中执行该函数,而不是在构建即席查询期间执行。例如,此代码:

 set @sql=@sql+'UNION select items from'+ dbo.FN_Split(@p_SourceText,
                  @p_Delimeter)+' where orderId ='+@i+')'

会变成:

set @sql = @sql+'UNION select items from dbo.FN_Split(' + @p_SourceText +', ' +
                  @p_Delimeter + ') where orderId =' + @i + ')'

在您当前引用该功能的任何地方进行类似的更改。

答案 1 :(得分:0)

我想澄清旁观者的评论

尝试这样的代码:

while @i<=@max
begin
if @i=0
begin
set @sql='insert into Person select items from dbo.FN_Split(@p_SourceText,  
 @p_Delimeter) where orderId = 00'
end

 else
  begin
   if @i=(@max-1)
    begin
 set @sql=@sql+'UNION select items from dbo.FN_Split(@p_SourceText,
                  @p_Delimeter) where orderId ='+@i
    end
 else
  begin
   set @sql=@sql+'UNION select items from dbo.FN_Split(@p_SourceText,        
                 @p_Delimeter) where orderId ='+@i UNION'
      end
   end
   set @i=@i+1
end
END 

答案 2 :(得分:0)

对于我的情况,当我将数据从一个数据库导出到另一个数据库时,它确实是一个缺少的函数。无法在目标数据库中找到&gt;功能&gt;标量值函数。然后我创建了[dbo]。[equals]并且它有效。 (从源数据库复制)