Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

tql renvoyant une table à partir d'une fonction ou d'une procédure de magasin

Vous ne pouvez pas accéder aux tables temporaires à partir d'une fonction SQL. Vous devrez utiliser des variables de table donc essentiellement :

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

Modifier

Sur la base des commentaires à cette question, voici ma recommandation. Vous souhaitez joindre les résultats d'une procédure ou d'une fonction table dans une autre requête. Je vais vous montrer comment vous pouvez le faire, puis vous choisissez celui que vous préférez. Je vais utiliser un exemple de code de l'un de mes schémas, mais vous devriez pouvoir l'adapter. Les deux sont des solutions viables d'abord avec une procédure stockée.

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

Dans ce cas, vous devez déclarer une table temporaire ou une variable de table pour stocker les résultats de la procédure. Voyons maintenant comment vous feriez cela si vous utilisiez une UDF

select *
from fn_Industry_GetAll()
inner join [user] 
    on account=[user].loginname

Comme vous pouvez le voir, l'UDF est beaucoup plus concis, plus facile à lire et fonctionne probablement un peu mieux puisque vous n'utilisez pas la table temporaire secondaire (les performances sont une supposition complète de ma part).

Si vous allez réutiliser votre fonction/procédure dans de nombreux autres endroits, je pense que l'UDF est votre meilleur choix. Le seul problème est que vous devrez arrêter d'utiliser les tables #Temp et utiliser des variables de table. À moins que vous n'indexiez votre table temporaire, il ne devrait y avoir aucun problème et vous utiliserez moins tempDb puisque les variables de table sont conservées en mémoire.