Korzystam z następującego kodu, aby sprawdzić, czy istnieje tabela tymczasowa i upuścić tabelę, jeśli istnieje, przed ponownym utworzeniem. Działa dobrze, dopóki nie zmieniam kolumn. Jeśli dodam kolumnę później, wyświetli się komunikat „nieprawidłowa kolumna”. Daj mi znać, co robię źle.
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
)
select company, stepid, fieldid from #Results
--Works fine to this point
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
NewColumn NVARCHAR(50)
)
select company, stepid, fieldid, NewColumn from #Results
--Does not work
BEGIN TRANSACTION; CREATE TABLE #Results; ...; DROP TABLE #Results; COMMIT
. Jeśli transakcja się powiedzie, tabela zostanie usunięta. Jeśli się nie powiedzie, tabela również zniknie (ponieważ została utworzona w ramach transakcji). W każdym razie: Nie trzeba sprawdzać, czy tabela już istnieje.Odpowiedzi:
Nie mogę odtworzyć błędu.
Być może nie rozumiem problemu.
Poniższe działa dla mnie dobrze w SQL Server 2005, z dodatkową kolumną „foo” pojawiającą się w drugim wyniku wyboru:
źródło
'tempdb..#name'
jest dokładnie tym, czego potrzebowałem. Używałem'dbo.#name'
, jak głupiec. Rozumiemtempdb
, ale co z podwójnymi kropkami?Oświadczenie powinno być uporządkowane
Bez „GO” pomiędzy nimi, całość będzie traktowana jako pojedynczy skrypt, a kiedy instrukcja select szuka kolumny, nie zostanie znaleziona.
W przypadku „GO” rozważy część skryptu aż do „GO” jako pojedynczą partię i wykona się, zanim przejdzie do zapytania po „GO”.
źródło
Zamiast
dropping
tworzyć tabelę tymczasowątruncate
i ponownie ją tworzyć, możesz jej ponownie użyćJeśli używasz
Sql Server 2016
lubAzure Sql Database
użyj poniższej składni, aby upuścić tabelę tymczasową i ponownie ją utworzyć. Więcej informacji tutaj MSDNSkładnia
Pytanie:
źródło
truncate/reuse
metoda będzie bardziej wydajny niżDROP TABLE IF EXISTS
naSql Server 2016
iAzure Sql Database
tak dobrze. Czy tak nie jest?DROP TABLE IF Exists
dla SQL 2016 lub Azure? Składnia jest dostępna począwszy od SQL 2008. Widzisz łącze MSDN w swojej odpowiedzi? Współczynnik wydajności?DROP TABLE
jest obsługiwany z SQL Server 2008, aleIF EXISTS
klauzula została wprowadzona w 2016 roku.INTO
: wybierz * INTO #HistoricoUserTable z dbo.HistoricoUserMyślę, że problem polega na tym, że musisz dodać instrukcję GO pomiędzy, aby rozdzielić wykonanie na partie. Jako drugi skrypt zrzutu, tj.
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
Nie upuścił tabeli temp będącej częścią pojedynczej partii. Czy możesz wypróbować poniższy skrypt?źródło
tempdb..
w powyższym kodzie jest bardzo ważne. Musi poprzedzać nazwę tabeli tymczasowej. Samo sprawdzenieOBJECT_ID('#Results')
to za mało. Tabele tymczasowe są przechowywane w bazie danych TempDB. Per Microsoft: Systemowa baza danych TempDB to globalny zasób, który jest dostępny dla wszystkich użytkowników podłączonych do instancji SQL Server lub połączonych z bazą danych SQLtempdb
inaczej nie zniknie.Można to osiągnąć za pomocą jednego wiersza kodu:
źródło
To zadziałało dla mnie: social.msdn.microsoft.com/Forums/en/transactsql/thread/02c6da90-954d-487d-a823-e24b891ec1b0?prof=required
źródło
Tylko mały komentarz z mojej strony, ponieważ
OBJECT_ID
to nie działa dla mnie. Zawsze to zwraca..even choć nie istnieje. Właśnie znalazłem, że jest przechowywany pod inną nazwą (po
_
podkreśleniu):#tempTable________
Działa to dla mnie dobrze:
źródło
Teraz możesz użyć poniższej składni, jeśli korzystasz z jednej z nowych wersji programu SQL Server (2016+).
źródło
Incorrect syntax near the keyword 'IF'.
IF [NOT] EXISTS
Klauzula jest dostępna z SQL Server 2016. To nie ma znaczenia, który SSMS wersji używasz.pmac72 używa GO, aby podzielić zapytanie na partie i używa ALTER.
Wygląda na to, że uruchamiasz tę samą partię, ale uruchamiasz ją dwukrotnie po zmianie: DROP ... CREATE ... edit ... DROP ... CREATE ..
Być może opublikuj swój dokładny kod, abyśmy mogli zobaczyć, co się dzieje.
źródło
Zazwyczaj trafiam ten błąd, gdy już utworzyłem tabelę tymczasową; kod, który sprawdza, czy w instrukcji SQL nie ma błędów, widzi „starą” tabelę tymczasową na miejscu i zwraca błędne obliczenie liczby kolumn w późniejszych instrukcjach, tak jakby tabela tymczasowa nigdy nie została usunięta.
Po zmianie liczby kolumn w tabeli tymczasowej po utworzeniu wersji z mniejszą liczbą kolumn, upuść tabelę i NASTĘPNIE uruchom zapytanie.
źródło
Niedawno widziałem, jak DBA robi coś podobnego do tego:
źródło
Mój kod używa
Source
tabeli, która się zmienia, iDestination
tabeli, która musi pasować do tych zmian.źródło
Tak, „nieprawidłowa kolumna” ten błąd podniesiony z wiersza „wybierz firmę, stepid, fieldid, NewColumn z #Results”.
Istnieją dwie fazy uruchamiania t-sql,
po pierwsze, parsowanie, w tej fazie serwer sql sprawdza poprawność przesłanego ciągu sql, w tym kolumny tabeli, i optymalizuje zapytanie, aby uzyskać najszybsze przywracanie.
po drugie, uruchamianie, przywracanie danych.
Jeśli tabela #Results istnieje, wówczas proces analizowania sprawdzi, czy określone kolumny są poprawne, czy nie, w przeciwnym razie (tabela nie istnieje) analizowanie zostanie przekazane zgodnie z podanymi kolumnami sprawdzającymi.
źródło
Po zmianie kolumny w tabeli tymczasowej należy usunąć tabelę przed ponownym uruchomieniem zapytania. (Tak, to denerwujące. Właśnie to musisz zrobić.)
Zawsze zakładałem, że dzieje się tak, ponieważ sprawdzanie „niepoprawnej kolumny” jest wykonywane przez analizator składni przed uruchomieniem zapytania, więc jest ono oparte na kolumnach w tabeli przed usunięciem ..... i to również powiedział pnbs.
źródło