Declare a variável na função com valor de tabela


Respostas:


207

Existem dois tipos de funções com valor de tabela. Aquele que é apenas uma instrução select e que pode ter mais linhas do que apenas uma instrução select.

Isso não pode ter uma variável:

create function Func() returns table
as
return
select 10 as ColName

Você tem que fazer assim:

create function Func()
returns @T table(ColName int)
as
begin
  declare @Var int
  set @Var = 10
  insert into @T(ColName) values (@Var)
  return
end

34
O primeiro exemplo é conhecido como uma "função incorporada com valor de tabela", que tem benefícios de desempenho em comparação com um Multi-declaração função com valor de tabela, ou seja, o servidor de banco de dados pode recompor a consulta com o ITVF embutido na consulta pai, essencialmente, tornar-se um parametrizado VIEWao passo que um MSTVF se comporta mais como um procedimento armazenado opaco (embora com suas próprias vantagens em comparação com sprocs). Funções embutidas devem ter preferência sobre MSTVF. Se você precisar calcular e armazenar valores intermediários (como o resultado de uma expressão de função escalar complexa), use uma subconsulta.
Dai

1
Provavelmente também vale a pena mencionar que, se o resultado de tudo o que você está usando para preencher a variável que deseja definir for de alguma forma generalizável, você pode considerar a possibilidade de escrever uma função separada para gerá-la. Isso permitiria que você usasse o ITVF descrito por @Dai acima, com todos os seus benefícios, enquanto ainda inseria um valor gerado dinamicamente em sua função. Acabei de escrever uma função com a ajuda da solução acima (obrigado @MikaelEriksson!) Que passa um de seus parâmetros para uma função auxiliar para evitar que eu tenha que usar o formulário MSTVF.
naughtilus

1
o maior custo é inserir para minha função e não sei como pular esse custo sem inserir na variável da tabela e retornar o resultado do select
uzay95

@naughtilus, seria ótimo ver um exemplo disso. Você já pensou em fornecer outra resposta junto com sua sugestão?
Jacques
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.