sql >> Base de Datos >  >> RDS >> Sqlserver

tsql devolviendo una tabla desde una función o procedimiento de almacenamiento

No puede acceder a tablas temporales desde dentro de una función SQL. Necesitará usar variables de tabla tan esencialmente:

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

Editar

Basado en los comentarios a esta pregunta, aquí está mi recomendación. Desea unir los resultados de un procedimiento o una función con valores de tabla en otra consulta. Te mostraré cómo puedes hacerlo y luego eliges el que prefieras. Voy a usar un código de muestra de uno de mis esquemas, pero debería poder adaptarlo. Ambas son soluciones viables primero con un procedimiento almacenado.

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

En este caso, debe declarar una tabla temporal o una variable de tabla para almacenar los resultados del procedimiento. Ahora veamos cómo harías esto si estuvieras usando un UDF

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

Como puede ver, el UDF es mucho más conciso, más fácil de leer y probablemente funciona un poco mejor ya que no está usando la tabla temporal secundaria (el rendimiento es una suposición completa de mi parte).

Si va a reutilizar su función/procedimiento en muchos otros lugares, creo que UDF es su mejor opción. El único inconveniente es que tendrá que dejar de usar tablas #Temp y usar variables de tabla. A menos que esté indexando su tabla temporal, no debería haber ningún problema, y ​​utilizará tempDb menos ya que las variables de la tabla se mantienen en la memoria.