@table_variable ou #temp_table

11

Eu tenho uma grande variável de tipo de tabela definida pelo usuário que possui 129 colunas. Armazenarei em torno de 2000-3000 registros nessa variável de tabela por vez e passarei para vários procedimentos e funções armazenados para obter dados adicionais e fazer modificações. Esses dados adicionais e novas modificações serão armazenados em uma nova variável de tabela do mesmo tipo e retornados ao procedimento armazenado de origem por meio de um OUTPUTparâmetro. (Isso ocorre porque um parâmetro de tipo de tabela só pode ser passado como READONLY.)

Este é o meu pseudo-código:

  SP1
  @tmp tableType
  {
        INSERT @tmp EXEC
        SP2 (@tmp)

        INSERT @tmp EXEC
        SP3 (@tmp)
  }

Devo usar um @table_variableou #temp_table?

Sreekumar P
fonte

Respostas:

12

Existem dois blogs que você deve consultar. O primeiro ( aqui ) é uma comparação de variáveis ​​de tabela e tabelas temporárias. É de 2008 e permanece relevante para o SQL Server 2008 R2.

A segunda entrada do blog ( aqui ) trata de alguns dos conceitos errados (concepções perdidas) sobre variáveis ​​de tabela; incluindo a indexação de uma variável de tabela.

Ambas as entradas do blog, artigos, são escritas por Gail Shaw.

Acredito que o único item que você está procurando é que uma variável de tabela não pode ser transmitida entre procedimentos armazenados enquanto uma tabela temporária pode ser transmitida entre procedimentos armazenados. O mais próximo que uma variável de tabela chega da passagem entre procedimentos armazenados é como um tipo de tabela definido pelo usuário.

Passar uma variável de tabela como TVP para um procedimento armazenado tem o requisito de que deve ser definido como um parâmetro READ-ONLY. Isso implica que haverá várias cópias da variável de tabela se você desejar retornar uma cópia modificada dela.

No total, a passagem entre o procedimento armazenado pode ser melhor atendida por uma Tabela Temp quando você deseja retornar a estrutura passada com valores atualizados.

Robert Miller
fonte
5

Nada melhor do que tentar os dois, mas acho que #tempTables tem um desempenho melhor depois que você entra nas centenas de registros.

SqlACID
fonte
3
Acrescente a isso o fato de que as tabelas temporárias podem ter índices, ter estatísticas, enquanto as variáveis ​​da tabela podem ter apenas uma PK. Você tem alguns detalhes aqui .
Marian