Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

tsql retornando uma tabela de uma função ou procedimento de armazenamento


Você não pode acessar tabelas temporárias de dentro de uma função SQL. Você precisará usar variáveis ​​de tabela tão essencialmente:
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


Com base nos comentários a esta pergunta, aqui está minha recomendação. Você deseja unir os resultados de um procedimento ou função com valor de tabela em outra consulta. Eu vou te mostrar como você pode fazer isso, então você escolhe o que você prefere. Vou usar o código de exemplo de um dos meus esquemas, mas você deve conseguir adaptá-lo. Ambas são soluções viáveis ​​primeiro com um procedimento armazenado.
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

Neste caso, você deve declarar uma tabela temporária ou variável de tabela para armazenar os resultados do procedimento. Agora vamos ver como você faria isso se estivesse usando uma UDF
select *
from fn_Industry_GetAll()
inner join [user] 
    on account=[user].loginname

Como você pode ver, a UDF é muito mais concisa, mais fácil de ler e provavelmente funciona um pouco melhor, pois você não está usando a tabela temporária secundária (o desempenho é uma suposição completa da minha parte).

Se você for reutilizar sua função/procedimento em muitos outros lugares, acho que a UDF é sua melhor escolha. O único problema é que você terá que parar de usar tabelas #Temp e usar variáveis ​​de tabela. A menos que você esteja indexando sua tabela temporária, não deve haver problemas e você usará menos o tempDb, pois as variáveis ​​da tabela são mantidas na memória.