Sie können nicht innerhalb einer SQL-Funktion auf temporäre Tabellen zugreifen. Sie müssen also im Wesentlichen Tabellenvariablen verwenden:
ALTER FUNCTION FnGetCompanyIdWithCategories()
RETURNS @rtnTable TABLE
(
-- columns returned by the function
ID UNIQUEIDENTIFIER NOT NULL,
Name nvarchar(255) NOT NULL
)
AS
BEGIN
DECLARE @TempTable table (id uniqueidentifier, name nvarchar(255)....)
insert into @myTable
select from your stuff
--This select returns data
insert into @rtnTable
SELECT ID, name FROM @mytable
return
END
Bearbeiten
Basierend auf Kommentaren zu dieser Frage ist hier meine Empfehlung. Sie möchten die Ergebnisse einer Prozedur oder einer Tabellenwertfunktion in einer anderen Abfrage zusammenführen. Ich zeige Ihnen, wie Sie es tun können, und wählen Sie dann das aus, das Sie bevorzugen. Ich werde Beispielcode aus einem meiner Schemas verwenden, aber Sie sollten in der Lage sein, ihn anzupassen. Beides sind zunächst praktikable Lösungen mit einer gespeicherten Prozedur.
declare @table as table (id int, name nvarchar(50),templateid int,account nvarchar(50))
insert into @table
execute industry_getall
select *
from @table
inner join [user]
on account=[user].loginname
In diesem Fall müssen Sie eine temporäre Tabelle oder Tabellenvariable deklarieren, um die Ergebnisse der Prozedur zu speichern. Schauen wir uns nun an, wie Sie dies tun würden, wenn Sie eine UDF verwenden
select *
from fn_Industry_GetAll()
inner join [user]
on account=[user].loginname
Wie Sie sehen können, ist die UDF viel prägnanter, einfacher zu lesen und funktioniert wahrscheinlich etwas besser, da Sie die sekundäre temporäre Tabelle nicht verwenden (die Leistung ist eine vollständige Schätzung meinerseits).
Wenn Sie Ihre Funktion/Prozedur an vielen anderen Stellen wiederverwenden möchten, ist die UDF meiner Meinung nach die beste Wahl. Der einzige Haken ist, dass Sie aufhören müssen, #Temp-Tabellen zu verwenden und Tabellenvariablen verwenden. Sofern Sie Ihre temporäre Tabelle nicht indizieren, sollte es kein Problem geben, und Sie werden die tempDb weniger verwenden, da Tabellenvariablen im Speicher gehalten werden.