wake-up-neo.com

Die Spalte "dbo" oder die benutzerdefinierte Funktion oder das Aggregat "dbo.Splitfn" wurden nicht gefunden, oder der Name ist nicht eindeutig

Hai Jungs,

Ich habe die folgende Split-Funktion verwendet,

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  

und ich habe diese Funktion in einer Abfrage verwendet und sie wurde ausgeführt

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

aber wenn ich meine Speicherprozedur ausführe, die Werte gibt, sagen Sie (1,2), erhielt ich den Fehler

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

Ich habe meine tabellarisch bewerteten Funktionen überprüft, die Funktion 'splitfn' war da, aber ich weiß nicht, was falsch läuft? Irgendwelche Vorschläge..

46
ACP

Es ist eine Tabellenfunktion, die Sie jedoch als Skalarfunktion verwenden.

Versuchen:

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

Aber ... überlegen Sie auch, Ihre Funktion in eine Inline-TVF umzuwandeln, da diese eine bessere Leistung erbringt.

81
Rob Farley

Sie müssen eine Tabelle mit dem Wert udf wie eine Tabelle behandeln, z. B. JOIN

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

Eine allgemeine Antwort

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

aber

select [dbo].[SplitString]('1,2',',')  -- will not work and throws this error
4
Arun Prasad E S

Da die Leute von Google kommen, stellen Sie sicher, dass Sie sich in der richtigen Datenbank befinden.

Wenn Sie SQL in der 'master'-Datenbank ausführen, wird dieser Fehler häufig zurückgegeben.

3
PBeezy