Zum Inhalt wechseln


Foto

Warum kann eine Funktion nicht auf eine TempTable zugreifen ?

MS SQL

  • Bitte melde dich an um zu Antworten
5 Antworten in diesem Thema

#1 Lizenzmanager

Lizenzmanager

    Newbie

  • 23 Beiträge

 

Geschrieben 01. Dezember 2015 - 17:00

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

 

 


Alles wird gut


#2 zahni

zahni

    Expert Member

  • 16.390 Beiträge

 

Geschrieben 02. Dezember 2015 - 14:44

Vielleicht hilft dieser Blog weiter:

 

http://db-berater.bl...nvariablen.html


Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!


#3 Lizenzmanager

Lizenzmanager

    Newbie

  • 23 Beiträge

 

Geschrieben 02. Dezember 2015 - 17:35

Vielen Dank zahni,

 

aber ich finde dort keinen Hinweis auf meine Frage.


Alles wird gut


#4 zahni

zahni

    Expert Member

  • 16.390 Beiträge

 

Geschrieben 02. Dezember 2015 - 18:41

Anhand Deiner Beschreibung kann aber auch niemand Dein Problem verstehen. Also möglichst exakt beschreiben. Am Besten mit einem konkreten Beispiel.


Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!


#5 Lizenzmanager

Lizenzmanager

    Newbie

  • 23 Beiträge

 

Geschrieben 07. Dezember 2015 - 11:54

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 :)

 

 


Alles wird gut


#6 zahni

zahni

    Expert Member

  • 16.390 Beiträge

 

Geschrieben 07. Dezember 2015 - 16:15

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).


Wen du nicht mit Können beeindrucken kannst, den verwirre mit Schwachsinn!




Auch mit einem oder mehreren der folgenden Tags versehen: MS SQL