none
Tabellenwertfunktion in Skalarwertfunktion umwandeln RRS feed

  • Frage

  • Folgende Abfrage liefert einen einzelnen Tabelleneintrag (Wohnort zu Eingabenamen):

    CREATE FUNCTION finde_Wohnort 
    (	
    	-- Add the parameters for the function here
    	@name char(100)
    )
    RETURNS TABLE 
    AS
    RETURN 
    (
    
    	-- Add the SELECT statement with parameter references here
    	SELECT wohnort.ort
    	from dbo.wohnort, dbo.name
    	where dbo.name.wohnortid = wohnort.id
    	AND name.name = @name
    )
    GO

    Folgende Situation:

    Ich möchte die Rückgabe so erhalten, dass ich daraus einen char-wert erhalte, da ich mit dem besser arbeiten kann - bei dem gleichen Select-string meckert das Management Studio aber, dass das Select keinen Wert zurückgeben kann.

    Wie muss ich den Quelltext umschreiben und als Skalarwertfunktion eingeben, dass ein Char zurückegeben wird?

    Mein Versuch:

    CREATE FUNCTION finde_Wohnort 
    (
    	-- Add the parameters for the function here
    	@name char(100)
    )
    RETURNS char(100)
    AS
    BEGIN
    	-- Declare the return variable here
    	DECLARE @Result char(100)
    
    	-- Add the T-SQL statements to compute the return value here
    	SELECT wohnort.ort
    	from dbo.wohnort, dbo.name
    	where dbo.name.wohnortid = wohnort.id
    	AND name.name = @name
    	--@Result = @name
    
    	-- Return the result of the function
    	RETURN @Result
    
    END
    GO

    Hier kommt für 

    SELECT wohnort.ort

    der Fehler:

    Meldung 444, Ebene 16, Status 2, Prozedur finde_Wohnort, Zeile 18
    In eine Funktion eingeschlossene SELECT-Anweisungen können keine Daten an einen Client zurückgeben.


    • Bearbeitet paradonym Mittwoch, 26. März 2014 09:59
    Mittwoch, 26. März 2014 09:41

Antworten

  • Was Andreas Dir mitteilen wollte ist, das es so aussehen müsste:

    CREATE FUNCTION finde_Wohnort 
    (
    	-- Add the parameters for the function here
    	@name char(100)
    )
    RETURNS char(100)
    AS
    BEGIN
    	-- Declare the return variable here
    	DECLARE @Result char(100)
    
    	-- Add the T-SQL statements to compute the return value here
    	SELECT @Result = wohnort.ort
    	from dbo.wohnort, dbo.name
    	where dbo.name.wohnortid = wohnort.id
    	AND name.name = @name
    	--@Result = @name
    
    	-- Return the result of the function
    	RETURN @Result
    
    END
    GO


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert paradonym Mittwoch, 26. März 2014 12:05
    Mittwoch, 26. März 2014 11:35
  • ...Meldung 444, Ebene 16, Status 2, Prozedur finde_Wohnort, Zeile 18
    In eine Funktion eingeschlossene SELECT-Anweisungen können keine Daten an einen Client zurückgeben.

    ...

    Dieser Fehler ist genau das Problem.In der Dokumentation wäre das der Punkt:

    Interoperabilität:

    "SELECT-Anweisungen, die Auswahllisten mit Ausdrücken enthalten, die lokalen Variablen Werte zuweisen."

    - aber eben kein direktes Select. Das geht nur in Prozeduren.

    Du musst deine Variable "@Return" auch füllen ;-)


    Andreas Wolter (Blog | Twitter)
    MCM - Microsoft Certified Master SQL Server 2008
    MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
    www.andreas-wolter.com | www.SarpedonQualityLab.com



    Mittwoch, 26. März 2014 11:23

Alle Antworten

  • Syntaxbeispiele findest Du hier: http://msdn.microsoft.com/de-de/library/ms186755.aspx

    Generell kann ich die Verwendung von Skalarwertfunktionen aber nicht empfehlen.


    Andreas Wolter (Blog | Twitter)
    MCM - Microsoft Certified Master SQL Server 2008
    MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
    www.andreas-wolter.com | www.SarpedonQualityLab.com

    Mittwoch, 26. März 2014 10:46
  • An diese Syntax müsste ich mich ja gehalten haben - jedenfalls sehe ich auch jetzt nicht direkt, warum bei mir die Syntax falsch ist - sonst hätte das Management Studio ja auch noch mehr Fehler gemeldet.
    Mittwoch, 26. März 2014 11:01
  • ...Meldung 444, Ebene 16, Status 2, Prozedur finde_Wohnort, Zeile 18
    In eine Funktion eingeschlossene SELECT-Anweisungen können keine Daten an einen Client zurückgeben.

    ...

    Dieser Fehler ist genau das Problem.In der Dokumentation wäre das der Punkt:

    Interoperabilität:

    "SELECT-Anweisungen, die Auswahllisten mit Ausdrücken enthalten, die lokalen Variablen Werte zuweisen."

    - aber eben kein direktes Select. Das geht nur in Prozeduren.

    Du musst deine Variable "@Return" auch füllen ;-)


    Andreas Wolter (Blog | Twitter)
    MCM - Microsoft Certified Master SQL Server 2008
    MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
    www.andreas-wolter.com | www.SarpedonQualityLab.com



    Mittwoch, 26. März 2014 11:23
  • Was Andreas Dir mitteilen wollte ist, das es so aussehen müsste:

    CREATE FUNCTION finde_Wohnort 
    (
    	-- Add the parameters for the function here
    	@name char(100)
    )
    RETURNS char(100)
    AS
    BEGIN
    	-- Declare the return variable here
    	DECLARE @Result char(100)
    
    	-- Add the T-SQL statements to compute the return value here
    	SELECT @Result = wohnort.ort
    	from dbo.wohnort, dbo.name
    	where dbo.name.wohnortid = wohnort.id
    	AND name.name = @name
    	--@Result = @name
    
    	-- Return the result of the function
    	RETURN @Result
    
    END
    GO


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert paradonym Mittwoch, 26. März 2014 12:05
    Mittwoch, 26. März 2014 11:35