Jump to content

Warum kann eine Funktion nicht auf eine TempTable zugreifen ?


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen,

 

ich habe feststellen müssen, dass eine Funktion nicht auf eine globale (und natürlich auch lokale) temporäre Tabelle zugreifen kann.

 

Ich habe eine StoredProcedure gebaut, die mir meine gewünschten Daten in eine globale temporäre Tabelle schreibt und kann mit zwei nachgelagerten Funktionen nicht auf diese temporäre Tabelle zugreifen (SELECT * FROM ##tmpTableXYZ).

 

Bei meinen Recherchen habe ich nur ermitteln können, dass das nicht geht.

Mich würde aber der Grund dafür interessieren.

 

Weiss das zufällig jemand von euch ?

 

Gruss

 

 

Link zu diesem Kommentar

OK, dann schreibe ich mal etwas PseudoCode. Die Tabellen und SELECT-Statements sind natürlich wesentlich komplexer, sonst würde ich ja auch keine temp-Tabelle befüllen :

So ungefähr kann man sich die StoredProcedure vorstellen :

 

CREATE PROCEDURE spBeispiel

AS

BEGIN

IF OBJECT_ID('tempdb..##tmpTabelle') IS NOT NULL

DROP TABLE ##tmpTabelle

CREATE TABLE ##tmpTabelle (

Name NVARCHAR(50) NULL,

Vorname NVARCHAR(50) NULL,

Typ NVARCHAR(20) NULL

)

SELECT Name, Vorname, Typ

INTO ##tmpTabelle

FROM MeineDatenQuelle

WHERE

Typ IN ('intern', 'extern')

END

 

Nun wollte ich mittels zwei Funktionen jeweils 2 Tabellen zurückgeliefert bekommen, die mir einerseits interne und andererseits externe Mitarbeiter ausgibt :

 

CREATE FUNCTION getInterne ()

RETURNS @table TABLE

(

Name NVARCHAR(50) NULL,

Vorname NVARCHAR(50) NULL

)

AS

BEGIN

SELECT Name, Vorname

INTO @table

FROM ##tmpTabelle

WHERE Typ = 'interne'

RETURN

END

 

CREATE FUNCTION getExterne ()

RETURNS @table TABLE

(

Name NVARCHAR(50) NULL,

Vorname NVARCHAR(50) NULL

)

AS

BEGIN

SELECT Name, Vorname

INTO @table

FROM ##tmpTabelle

WHERE Typ = 'externe'

RETURN

END

 

Die Funktionenen verwenden wir so, weil unser SoftwareArchitekt das so vorgibt.

Deshalb wollte ich mich einfach daran halten und habe auch hierfür Funktionen verwenden wollen.

 

Nun habe ich das bereits umgestellt auf eine StoredProcedure, die die gesamte Arbeit durchführt, aber eben, ich würde gerne wissen,

warum eine Funktion nicht auf eine temp-Tabelle (lesend) zugreifen darf.

 

Dass ich in einer Funktion keine Datenmanipulation oder Datendefinition vornehmen darf, ist mir bewusst.

 

Ich hoffe, dass es durch den Code etwas verständlicher geworden ist ?

 

Gruss und einen guten Start in die neue Woche :)

 

 

Link zu diesem Kommentar

Hi,

 

Du hast also 2 Funktionen, die "irgendwann" auf  die Temp-Table zugreifen wollen? Dann lies Die  nochmals meinen Link durch.

 

Zitate "Lokale temporäre Relationen sind nur innerhalb der Datenbanksitzung".

 

"Sie (globale temporäre Tabellen) werden gelöscht, nachdem alle Benutzer, die auf diese Tabelle verweisen, die Verbindung mit der Instanz von SQL Server getrennt haben."

 

Deine Tabellen sind Global. Nun überlege, ob die Datenbanksitzung, welche die Tabelle erstellt hat, zum Zeitpunkt der Ausführung Deiner Functions noch Aktiv ist.

Es kann gut sein, dass Deine Anwendung immer wieder neue  Sitzungen erstellt.

 

Ohne zu wissen was Du da machst: Vielleicht ist eine View der bessere Weg. Temp. Tabellen braucht  man eher selten oder sie werden dynamisch in Views erzeugt (und dann gleicher wieder verworfen).

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...