【问题标题】:Cannot find either column “dbo” or the user-defined function or aggregate “dbo.FN_Split”, or the name is ambiguous找不到列“dbo”或用户定义的函数或聚合“dbo.FN_Split”,或者名称不明确
【发布时间】:2014-01-06 05:53:29
【问题描述】:

我有以下函数接受 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

& 像这样使用上述函数& 将结果插入数据库的存储过程:

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 行)

请帮助摆脱它...

【问题讨论】:

  • dbo.FN_Split(@p_SourceText, @p_Delimeter) 的结果选择到一个文本变量中,并将其用于您的@sql 字符串构建。
  • Function dbo.FN_Split(@p_SourceText, @p_Delimeter) 返回一个表,而不是单个变量,所以用法是 SELECT * FROM dbo.FN_Split(@p_SourceText, @p_Delimeter) 而不是 SELECT dbo .FN_Split(@p_SourceText, @p_Delimeter)
  • 问题 title 中的错误是一个简单的拼写错误,但由于FN_Slit 没有出现在问题的其他任何地方,我假设它是一个转录错误而不是实际问题。
  • 哦不,我确实输入错误函数名称是“FN_split”而不是“FN_slit”

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


【解决方案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 + ')'

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

【讨论】:

  • 您必须在插入时使用select 而不是values,因为您可能会插入多个值:Insert into person select items from dbo.FN_Split('111|Mitchell|Johnson,|') where orderId = 0` 请注意,您还需要在 csv 项目周围加上引号。
【解决方案2】:

我想澄清一下来自旁观者的评论

试试你的代码:

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 

【讨论】:

  • 参数需要动态拼接;它们不应该是文字。
  • 哦,是的,但你可以用你的执行官指定它们,或者像上面描述的那样。执行 usp_spexecutesql @sql, N'@p_sourceText varchar(30)', p_sourcetext = '值'
【解决方案3】:

就我而言,当我将数据从一个数据库导出到另一个数据库时,它确实缺少一个功能。在目标数据库 > 函数 > 标量值函数中找不到。然后我创建了 [dbo].[equals] 并且它起作用了。 (从源数据库复制)

【讨论】:

    猜你喜欢
    • 2015-05-26
    • 2020-12-07
    • 2019-08-01
    • 2011-01-06
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2011-07-13
    相关资源
    最近更新 更多