web-dev-qa-db-fra.com

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

Hai les gars,

J'ai utilisé la fonction de division 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  

et 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 quand j'excute ma procédure de magasin en donnant des valeurs disons (1,2) j'ai eu l'erreur

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 évaluées par table, la fonction 'splitfn' était là mais je ne sais pas ce qui ne va pas? Aucune suggestion..

46
ACP

C'est une fonction table, mais vous l'utilisez comme une fonction scalaire.

Essayer:

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

Mais ... envisagez également de changer votre fonction en un TVF en ligne, car il fonctionnera mieux.

81
Rob Farley

Vous devez traiter une table valorisée udf comme une table, par exemple

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

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
4
Arun Prasad E S

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 "principale" renvoie souvent cette erreur.

3
PBeezy