Temat: #Table i magia...?
Po pierwsze. Nie chcę wyjść na zarozumialca, ale się mylicie lub nie chcecie zrozumieć gdzie leży problem.
Po drugie. Postaram się dokładnie wytłumaczyć o co mi chodzi.
Po trzecie. Ostatni post, żeby nie wywoływac niepotrzebnych emocji.
Komunikat o treści:
" Server: Msg 207, Level 16, State 1, Procedure tmp_dropTemporary, Line 9 Invalid column name 'id_osoby'"
przy uruchomieniu skryptu:
"Exec tmp_dropTemporary"
który uruchamia procedurę utworzoną wcześniej o zawartości:
"create procedure tmp_dropTemporary
as
create table #TempTable(id_osoby decimal(9),nazwisko nvarchar 100))
insert into #TempTable (id_osoby, nazwisko) values (1,'ada')
alter table #TempTable drop column id_osoby
select * from #TempTable"
informuje tylko i wyłącznie o tym, że obiekt #TempTable1 w bazie TEMPDB jest już utworzony i nie posiada pola id_osoby.
I problemem tu nie jest to że jest tam. Tylko to, że nie ma pola id_osoby. Ponieważ kompilator dla celów uruchomienia najpierw sprawdza popraność składni/struktury. NIE MA TY ZNACZENIA CZY ZMIENIA KOLEJNOŚĆ CZY NIE. A śmiem wątpić czy coś takiego robi, a przynajmniej nie wiem dlaczego miałby to robić.
Dlaczego sprawdza czy istnieje obiekt o takiej nazwie nie wiem. Ale tak robi, pomimo tego, że obiekt o nazwie #TempTable1 utworzony w procedurze i obiekt #TempTable1 utworzony bez niej są obsługiwane niezależnie. Dla udowodnienia wykonałem coś takiego:
W jednej sesji (jednym otwartym oknie z query) wykonuje następujące czynności:
1. Drop'uje procedure (jeśli istnije)
drop procedure tmp_dropTemporary
2. Dropuje tablice tymczasową (jeśli istnieje)
drop table #TempTable
3. Zakładam procedurę:
create procedure tmp_dropTemporary
as
create table #TempTable(
id_osoby decimal(9),
nazwisko nvarchar(100))
insert into #TempTable (id_osoby, nazwisko) values (1,'ada')
alter table #TempTable drop column id_osoby
select * from #TempTable
4. Wykonuję procedurę:
Exec tmp_dropTemporary
Otrzymuje jeden rekord z jednym polem
5. Uruchamiam skrypt:
create table #TempTable(id_osoby decimal(9),nazwisko nvarchar(100))
insert into #TempTable (id_osoby, nazwisko) values (1,'ada')
select * from #TempTable
Otrzymuje jeden rekord z dwoma polami
6. Wykonuję procedurę:
Exec tmp_dropTemporary
Otrzymuje jeden rekord z jednym polem
7. Wykonuje skrypt :
insert into #TempTable (id_osoby, nazwisko) values (1,'ada')
select * from #TempTable
Otrzymuje 2 rekordy z dwoma polami
8.Wykonuję procedurę:
Exec tmp_dropTemporary
Otrzymuje jeden rekord z jednym polem
9. Wykonuje skrypt :
insert into #TempTable (id_osoby, nazwisko) values (1,'ada')
select * from #TempTable
Otrzymuje 3 rekordy z dwoma polami.
10. Wykonuję procedurę:
Exec tmp_dropTemporary
Otrzymuje jeden rekord z jednym polem
11. Wykonuje skrypt :
insert into #TempTable (id_osoby, nazwisko) values (1,'ada')
alter table #TempTable drop column id_osoby
select * from #TempTable
Otrzymuje 4 rekordy z jednym polem.
12. Wykonuję procedurę:
Exec tmp_dropTemporary
Otrzymuje błąd :
Msg 207, Level 16, State 1, Procedure tmp_dropTemporary, Line 6
Invalid column name 'id_osoby'.
Wniosek dla mnie jest taki:
W innym kontekście jest uruchamiane sprawdznie, a w innym wykonanie.
Życzę miłego dnia i powodzenia.
Przepraszam za nadgorliwość ale dla mnie ważniejsze jest rozwiązanie problemu niż eliminacja skutków problemów.