[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.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
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.pldoc.pisz.plpdf.pisz.platanvarne633.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 |
|