2010-01-19 10 views
39

Hai Jungs,weder Spalte „dbo“ oder die benutzerdefinierte Funktion oder Aggregat „dbo.Splitfn“ finden oder der Name ist nicht eindeutig

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 i verwenden diese Funktion in einer Abfrage und es wurde

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 

ausgeführt, aber wenn ich meinen Speicher Prozedur geben Werte excute sagen (1,2) ich habe den Fehler

Ich habe meine tablevalued Funktionen überprüft die Funktion 'Splitfn' war da, aber ich weiß nicht, was schief läuft? Irgendwelche Vorschläge ..

Antwort

64

Es ist eine Tabellenwertfunktion, aber Sie verwenden es als Skalarfunktion.

Versuchen:

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

Aber ... Sehen Sie auch Ihre Funktion in ein Inline-TVF zu ändern, wie es wird besser.

+0

@Rob es funktionierte für mich .. Wie man es in eine Inline TVF .. Plz Anleitung –

+0

Es gibt viele Beispiele herum. Hier ist einer: http://sqlserverpedia.com/blog/sql-server-bloggers/splitting-a-delimited-string-part-1/ –

+0

Danke für die Antwort. Ich hatte das gleiche Problem und ich konnte nicht für das Leben von mir herausfinden, was vor sich ging. Du hast mir große Kopfschmerzen erspart. – gsirianni

10

Sie benötigen einen Tisch bewertet UDF wie eine Tabelle zu behandeln, zum Beispiel JOIN es

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

Eine allgemeine Antwort

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

aber

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

Da die Menschen kommen wird Google, stellen Sie sicher, dass Sie in der richtigen Datenbank sind.

Das Ausführen von SQL in der 'Master'-Datenbank gibt oft diesen Fehler zurück.