Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

tsql gibt eine Tabelle von einer Funktion oder Speicherprozedur zurück

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.