Mam złożone zapytanie SELECT, z którego chciałbym wstawić wszystkie wiersze do zmiennej tabeli, ale T-SQL na to nie pozwala.
W tym samym wierszu nie można używać zmiennej tabeli z zapytaniami SELECT INTO lub INSERT EXEC. http://odetocode.com/Articles/365.aspx
Krótki przykład:
declare @userData TABLE(
name varchar(30) NOT NULL,
oldlocation varchar(30) NOT NULL
)
SELECT name, location
INTO @userData
FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30
Dane w zmiennej tabeli zostaną później wykorzystane do wstawienia / aktualizacji z powrotem do różnych tabel (głównie kopia tych samych danych z niewielkimi aktualizacjami). Celem tego byłoby po prostu uczynienie skryptu nieco bardziej czytelnym i łatwiejszym do dostosowania niż wykonywanie SELECT INTO
bezpośrednio w odpowiednich tabelach. Wydajność nie stanowi problemu, ponieważ rowcount
jest dość mała i jest uruchamiana ręcznie tylko w razie potrzeby.
... lub po prostu powiedz mi, czy robię to wszystko źle.
źródło
Celem
SELECT INTO
jest (według dokumentów, mój nacisk)Ale ty już masz tabelę docelową! Więc czego chcesz
W tej składni dozwolone
MyTable
jest bycie zmienną tabelową.źródło
MyTable
tutaj jest symbolem zastępczym nazwy Twojej aktualnej tabeli . Nie sądzę, żeby istniały prawdziwe bazy danych z tabelą o nazwieMyTable
...Możesz także użyć typowych wyrażeń tabelowych do przechowywania tymczasowych zestawów danych. Są bardziej eleganccy i przyjaźni adhoc:
źródło
Możesz spróbować użyć tabel tymczasowych ... jeśli nie robisz tego z aplikacji. (Uruchomienie tego ręcznie może być w porządku)
Pomijasz wysiłek, aby zadeklarować tabelę w ten sposób ... Pomaga w zapytaniach adhoc ... Tworzy to lokalną tabelę tymczasową, która nie będzie widoczna dla innych sesji, chyba że jesteś w tej samej sesji. Być może problem występuje w przypadku uruchamiania zapytania z aplikacji.
jeśli potrzebujesz, aby działało w aplikacji, użyj zmiennych zadeklarowanych w ten sposób:
Edycja: jak wielu wspomniało o zaktualizowanej widoczności sesji od połączenia. Tworzenie tabel tymczasowych nie jest opcją dla aplikacji internetowych, ponieważ sesje mogą być ponownie użyte, w takich przypadkach trzymaj się zmiennych tymczasowych
źródło
function
. Z mojego doświadczenia wynika, że w większości przypadków, gdy ktoś myśli, że potrzebuje takich oświadczeń, w rzeczywistości oznacza to, że powinien przemyśleć swojefunction
- lub przynajmniej zmienić je naprocedure
. Przynajmniej mówię za siebie. :-)Spróbuj użyć
INSERT
zamiastSELECT INTO
:źródło
Najpierw utwórz tabelę tymczasową:
Krok 1:
** Krok 2: ** Wstaw pewną wartość do tabeli temperatur.
Krok 3: Zadeklaruj zmienną tabeli, aby przechowywać dane tabeli temp.
Krok 4: wybierz wartość z tabeli temp i wstaw do zmiennej tabeli.
Na koniec wartość jest wstawiana z tabeli tymczasowej do zmiennej tabeli
Krok 5: Można sprawdzić wstawioną wartość w zmiennej tabeli.
źródło
OK, teraz przy wystarczającym wysiłku jestem w stanie wstawić do @table, używając poniższego:
Najważniejsze jest tutaj wybranie kolumn do wstawienia.
źródło
Jednym z powodów użycia WYBIERZ W jest to, że pozwala ono na użycie TOŻSAMOŚCI:
Nie działałoby to ze zmienną tabelową, co jest zbyt złe ...
źródło
IDENTITY
kolumny.