69 votes

Impossible de trouver la colonne "dbo" ou la fonction définie par l'utilisateur ou l'agrégat "dbo.Splitfn", ou le nom est ambigu.

Hai les gars,

J'ai utilisé la fonction de fractionnement suivante,

CREATE FUNCTION dbo.Splitfn(@String varchar(8000), @Delimiter char(1))       
returns @temptable TABLE (items varchar(8000))       
 as       
begin       
declare @idx int       
declare @slice varchar(8000)       

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(Items) values(@slice)       

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

end  

J'ai utilisé cette fonction dans une requête et elle a été exécutée.

ALTER PROCEDURE [dbo].[Employees_Delete] 
-- Add the parameters for the stored procedure here
@Id varchar(50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here

 if exists( select Emp_Id from Employee where Emp_Id=dbo.Splitfn(@Id,','))
begin
    update Employee set Is_Deleted=1 where Emp_Id=dbo.Splitfn(@Id,',')
    select 'deleted' as message
end 
END

mais lorsque j'exécute ma procédure de stockage en donnant des valeurs comme (1,2), j'obtiens l'erreur suivante

Cannot find either column "dbo" or the user-defined 
function or aggregate "dbo.Splitfn", or the name is ambiguous.

J'ai vérifié mes fonctions de tablevalued, la fonction 'splitfn' était présente mais je ne sais pas ce qui ne va pas ? Si vous avez des suggestions

108voto

Rob Farley Points 9042

C'est une fonction à valeur de tableau, mais vous l'utilisez comme une fonction scalaire.

Essayez :

where Emp_Id IN (SELECT i.items FROM dbo.Splitfn(@Id,',') AS i)

Mais... pensez aussi à transformer votre fonction en un TVF en ligne, car il sera plus performant.

0 votes

@Rob ça a marché pour moi.. Comment le changer en un TVF en ligne Plz me guider

0 votes

Il existe de nombreux exemples. En voici un : sqlserverpedia.com/blog/sql-server-bloggers/

0 votes

Merci pour la réponse. J'avais le même problème et je n'arrivais pas à comprendre ce qui se passait. Vous m'avez épargné un énorme mal de tête.

13voto

Arun Prasad E S Points 3375

Une réponse générale

select * from [dbo].[SplitString]('1,2',',') -- Will work 

mais

select [dbo].[SplitString]('1,2',',')  -- will **not** work and throws this error

13voto

gbn Points 197263

Vous devez traiter une table évaluée par udf comme une table, par exemple en la JOINant.

select Emp_Id 
from Employee E JOIN dbo.Splitfn(@Id,',') CSV ON E.Emp_Id = CSV.items

6voto

PBeezy Points 470

Puisque les gens viendront de Google, assurez-vous que vous êtes dans la bonne base de données.

L'exécution de SQL dans la base de données "maître" renvoie souvent cette erreur.

0 votes

Pour ceux qui luttent contre les erreurs de réplication. Ceci devrait les réparer !

0voto

rohit.khurmi095 Points 61
Database -> Tables -> Functions -> Scalar Valued Functions - dbo.funcName 
rightClick => Properties -> Search UserRoles + Add user access

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X