ďťż
 
[MSSQL] Tabela tymczasowa w funkcji? ďťż
 
[MSSQL] Tabela tymczasowa w funkcji?
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[MSSQL] Tabela tymczasowa w funkcji?



jerry - 17-11-2005 19:15
[MSSQL] Tabela tymczasowa w funkcji?
  Witam,

Czy w funkcjach TSQL definiowanych przez użytkownika mogę stosować
tabele tymczasowe, jeśli tak to bardzo proszę rzucić okiem na kod i
zasugerowaćco muszę w nim zmienić, aby nie generował błędu:

CREATE FUNCTION dbo.fpProcessGraf(
@pv_Condition VARCHAR(2000))

RETURNS @RESULT TABLE(
ProcessDef_Id NUMERIC(38,0)
,ProcessSymbol VARCHAR(2000)
,ProcessVer_Id NUMERIC(38,0)
,TicketVer_Id NUMERIC(38,0)
,TicketRelation VARCHAR(1)
,Neighbours VARCHAR(2000)
)

AS
BEGIN

-- create temporary table
CREATE TABLE #pt_NodesIds(Id INT, NodeId NUMERIC(38,0))
--
....
END

Server: Msg 2772, Level 16, State 1, Procedure fpProcessGraf, Line 18
Cannot access temporary tables from within a function.





Paweł Filipiak - 17-11-2005 19:15

  Użytkownik "jerry" <j.zarychta@interia.pl> napisał w wiadomości
news:dlhskf$p2o$1@news.interia.pl...
> Witam,
>
> Czy w funkcjach TSQL definiowanych przez użytkownika mogę stosować tabele
> tymczasowe, jeśli tak to bardzo proszę rzucić okiem na kod i
[...]
> Server: Msg 2772, Level 16, State 1, Procedure fpProcessGraf, Line 18
> Cannot access temporary tables from within a function.
Nic. Zgodnie z komunikatem błędu nie możesz tworzyć tablicy tymczasowej w
funkcji. Bardziej ogólnie, nie możesz wewnątrz funkcji wykonywać akcji,
których efekt działania "jest widoczny" poza funkcją.
Nie możesz użyć zamiast tablicy zmiennej tablicowej?

--
pozdrawiam,
Paweł Filipiak, gg 2791867




jerry - 17-11-2005 19:15

 
> Nic. Zgodnie z komunikatem błędu nie możesz tworzyć tablicy tymczasowej
> w funkcji. Bardziej ogólnie, nie możesz wewnątrz funkcji wykonywać
> akcji, których efekt działania "jest widoczny" poza funkcją.

Nie mogę także w funkcji wykonać select'a z tablicy tymczasowej? Na to
wygląda, gdyż mam ten sam komunikat.
Potrzebuje uzyc funkcji, która zwróci mi tabelę z odpowiednio
przygotowanymi danymi. No ale żeby te dane przygotować wykonuję b. wiele
operacji w procedurach właśnie na tabelach tymczasowych. W "końcowej"
funkcji chciałem "pozbierać" te dane i upakować do tabeli, która funkcja
ta ma zwrócić - a tu zonk! W funkcji nawet nie mogę czytać z tabel
tymczasowych!
W takim razie jak inaczej zwrócić tebele, tak bym mógł zapytać o jej
dane jak z funkcji:
SELECT x, y, z FROM moja_funkcja_zwracajaca_tabele
??
Moze da sie z procedury zwrocic tabele?




Paweł Filipiak - 17-11-2005 19:15

  Użytkownik "jerry" <j.zarychta@interia.pl> napisał w wiadomości
news:dlhvmf$sde$1@news.interia.pl...
[...]
> W takim razie jak inaczej zwrócić tebele, tak bym mógł zapytać o jej dane
> jak z funkcji:
> SELECT x, y, z FROM moja_funkcja_zwracajaca_tabele
> ??
> Moze da sie z procedury zwrocic tabele?

Da się zwrócic zmienną tablicową i wywołać funkcję tak jak checesz (jako
"argument" selecta)
tu masz przykład takiej konstrukcji i jej wywołania

http://msdn.microsoft.com/library/en...asp?frame=true

--
pozdrawiam,
Paweł Filipiak, gg 2791867





jerry - 17-11-2005 19:15

 
> Da się zwrócic zmienną tablicową i wywołać funkcję tak jak checesz (jako
> "argument" selecta)

Tak wiem, jednak samo utworzenie zmiennej tablicowej i zwrócenie jej w
wyniku funkcji nic nie da jeśli nie wypełnię tej struktury danymi. I tu
mam problem - w funkcji nie mogę odwoływać się do tablic tymczasowych a
muszę pobrać z nich dane, spreparować i zaladowac do wspomnianej juz
przez Pana zmiennej tablicowej w funkcji i zwrócić...

Błędne koło: tylko z funkcji mogę zwrócić tablicę ale akurat w funkcji
nie mogę jej odpowiednio przygotować (pobrać danych z tabel tymczasowych).

Czy muszę pobierać te dane wynikowe z tablic tymczasowych? - tak, system
w tych tabelach przechowuje tymczasowe, lecz ważne dla mnie dane, które
odpowiednio przygotowuję i chciałbym zwrócić wyniki;
Czy muszę dostać te dane z poziomu zapytania SELECT * FROM - tak, to
część wymagania systemu;

Mam wrażenie, że kręcę się wokół prostego rozwiązania jednak na codzień
i od dawna pracując z Oracle mam kłopot z mocno innym podejściem do
programowania RDBMS w MSSQL.

> tu masz przykład takiej konstrukcji i jej wywołania
>
> http://msdn.microsoft.com/library/en...asp?frame=true
>

Rozwiązaniem byłoby gdybym mógł zwrócić zmienną tablicową z procedury
jako OUTPUT, nie z funkcji (w ktorej nie mogę pobierać danych do tej
zmiennej) ale to także niedozwolone.
Czytam teraz o mozliwosci zwrocenia z procedury kursora i moze tędy
droga...
Pozdrawiam,




Paweł Filipiak - 18-11-2005 12:01

  "jerry" <j.zarychta@interia.pl> wrote in message
news:dli636$47q$1@news.interia.pl...
>
>> Da się zwrócic zmienną tablicową i wywołać funkcję tak jak checesz (jako
>> "argument" selecta)
>
> Tak wiem, jednak samo utworzenie zmiennej tablicowej i zwrócenie jej w
> wyniku funkcji nic nie da jeśli nie wypełnię tej struktury danymi. I tu
> mam problem - w funkcji nie mogę odwoływać się do tablic tymczasowych a
> muszę pobrać z nich dane, spreparować i zaladowac do wspomnianej juz przez
> Pana zmiennej tablicowej w funkcji i zwrócić...

Zmienna tablicowa to nie to samo co tablica tymczasowa. Tablicę tworzysz
przez create table #tab_name, a zmienną deklarujesz tak jak każdą inną. W
funkcji nie możesz stworzyć tablicy tymczasowej, ale możesz spokojnie
stworzyć funkcję zwracającą zmienną tablicową i tę zmienną (tablicę)
wypełnić w funkcji.
Zobacz proszę przykład (na dole strony, Example C "Multi-statement
table-valued function") w linku jaki Ci podałem, tam jest dokładnie taka
konstrukcja jakiej szukasz - jest to funkcja zwracająca zmienną tablicową.
Zmienna ta wypełniana jest danymi w funkcji, a wywoływana jest w konstrukcji
select * from przykladowa_funkcja()

[...]
>>
>> http://msdn.microsoft.com/library/en...asp?frame=true

--
pozdrawiam,
Paweł Filipiak




jerry - 23-11-2005 11:04

 
> Zmienna tablicowa to nie to samo co tablica tymczasowa. Tablicę tworzysz
> przez create table #tab_name, a zmienną deklarujesz tak jak każdą inną.
> W funkcji nie możesz stworzyć tablicy tymczasowej, ale możesz spokojnie
> stworzyć funkcję zwracającą zmienną tablicową i tę zmienną (tablicę)
> wypełnić w funkcji.

Tak, doskonale to rozumiem i znam różnicę między tabelą tymczasową, a
zmienną tablicową. Problem leży właśnie w wypełnieniu zmiennej
tablicowej danymi w funkcji. Te dane na których mi zależy są
przechowywane w tabelach tymczasowych (bardzo wielu) - do których w
funkcji nie mam dostępu. Problem dla mnie nie do rozwiązania! Nie mogę
dostać się do danych, pobrać te, które są mi potrzebne i zwrócić je w
postaci jednej tabeli z funkcji.

Mogę zrobić kolejną procedurę, która pobierze mi dane z kilkunastu tabel
tymczasowych i wypełni nimi kolejną - ZBIORCZĄ jakąś tabelę tymczasową.
Problem polega na tym, że nie mogę z niej robić SELECT w aplikacji -
aplikacja musi wywolac selecta z funkcji w ktorej wywolam procedury
inicjujące niektóre z tych tymczasowych tabel, wypelni je danymi i to ma
byc niewidoczne dla aplikacji - ona ma tylko zrobic SELECT * from
FUNKCJA, a funkcja zawiera całe mięso.
Niestety widzę, że w żaden sposób nie dostanę tego rezultatu za pomocą
tabel tymczasowych.

dziękuję za poświęcony czas i pozdrawiam,
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    Zdalny =?ISO-8859-2?Q?dost=EAp_do_MSSQL_bez_zarz=B1dzani?==?ISO-8859-2?Q?a?= [MSSQL] =?ISO-8859-2?Q?zgodno=B6ci_z_licencjami_Microsoft_?==?ISO-8859-2?Q?SQL_Server?= [MSSQL 2k] - jak =?ISO-8859-2?Q?pod=B3=B1czy=E6_serwer_na_?==?ISO-8859-2?Q?porcie_innym_ni=BF_1433=3F?= MSSQL Express czy Oracle Express MSSQL 2005 i uruchamianie procedury o =?ISO-8859-2?Q?okre=B6lone?==?ISO-8859-2?Q?j_godzinie?= [MSSQL] ACCESS - SQL =?ISO-8859-2?Q?B=B3ad_w_konwersji_lic?==?ISO-8859-2?Q?zb?= [MSSQL 2000] =?ISO-8859-2?Q?wywo=B3anie_procesu_z_poziomu_?==?ISO-8859-2?Q?job=27a?= [MSSQL 2K] =?ISO-8859-2?Q?Wp=B3yw_ustawie=F1_regionalnych_?==?ISO-8859-2?Q?serwera_na_zapytania?= Pobierananie danych z innej bazy danych w MSSQL Migracja MSSQL 2005 CTP na 2005 Express
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • atanvarne633.opx.pl
  • Cytat

    Decede mihi sole - nie zasłaniaj mi słonca.
    Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści
    Hoc fac - tak czyń.
    A tergo - od tyłu; z tyłu.
    I czarne włosy posiwieją. Safona

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com