@table_variable lub #temp_table

11

Mam dużą zmienną typu tabeli zdefiniowaną przez użytkownika, która ma 129 kolumn. Jednocześnie będę przechowywać około 2000-3000 rekordów w tej zmiennej tabeli i przekażę ją do różnych procedur przechowywanych i funkcji w celu uzyskania dodatkowych danych i wprowadzenia modyfikacji. Te dodatkowe dane i nowe modyfikacje zostaną następnie zapisane w nowej zmiennej tabeli tego samego typu i zwrócone do źródłowej procedury składowanej za pomocą OUTPUTparametru. (Jest tak, ponieważ parametr typu tabeli można przekazać tylko jako READONLY.)

To jest mój pseudo-kod:

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

        INSERT @tmp EXEC
        SP3 (@tmp)
  }

Czy powinienem użyć @table_variablelub #temp_table?

Sreekumar P.
źródło

Odpowiedzi:

12

Są dwa blogi, na które powinieneś spojrzeć. Pierwszy ( tutaj ) to porównanie zmiennych tabel i tabel temp. Pochodzi z 2008 roku i pozostaje odpowiedni dla SQL Server 2008 R2.

Drugi wpis na blogu ( tutaj ) dotyczy niektórych nieporozumień (pominiętych koncepcji) dotyczących zmiennych tabel; w tym indeksowanie zmiennej tabeli.

Oba wpisy na blogu, artykuły, zostały napisane przez Gail Shaw.

Uważam, że jedną rzeczą, której szukasz, jest Zmienna tabeli, która nie może być przekazywana między procedurami przechowywanymi, podczas gdy Tabela temperatur może być przekazywana między procedurami przechowywanymi. Najbliższe przekazywanie zmiennych tabeli między procedurami przechowywanymi jest jako tabela zdefiniowana przez użytkownika.

Przekazanie zmiennej tabeli jako TVP do procedury składowanej wymaga, aby była zdefiniowana jako parametr TYLKO DO CZYTANIA. Oznacza to, że będzie wiele kopii Zmiennej tabeli, jeśli chcesz zwrócić jej zmodyfikowaną kopię.

Podsumowując, przekazywanie między procedurami przechowywanymi może być lepiej obsługiwane przez tabelę temperatur, gdy chcesz zwrócić przekazaną strukturę ze zaktualizowanymi wartościami.

Robert Miller
źródło
5

Nie ma nic lepszego niż wypróbowanie obu, ale uważam, że #tempTables działa lepiej, gdy przejdziesz do setek rekordów.

SqlACID
źródło
3
Dodaj do tego fakt, że tabele temp mogą mieć indeksy, statystyki, podczas gdy zmienne tabeli mogą mieć tylko PK. Masz jakieś szczegóły tutaj .
Marian