Lizenzmanager 0 Geschrieben 1. Dezember 2015 Melden Teilen Geschrieben 1. Dezember 2015 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 Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 2. Dezember 2015 Melden Teilen Geschrieben 2. Dezember 2015 Vielleicht hilft dieser Blog weiter: http://db-berater.blogspot.de/2012/11/temporare-tabellen-vs-tabellenvariablen.html Zitieren Link zu diesem Kommentar
Lizenzmanager 0 Geschrieben 2. Dezember 2015 Autor Melden Teilen Geschrieben 2. Dezember 2015 Vielen Dank zahni, aber ich finde dort keinen Hinweis auf meine Frage. Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 2. Dezember 2015 Melden Teilen Geschrieben 2. Dezember 2015 Anhand Deiner Beschreibung kann aber auch niemand Dein Problem verstehen. Also möglichst exakt beschreiben. Am Besten mit einem konkreten Beispiel. Zitieren Link zu diesem Kommentar
Lizenzmanager 0 Geschrieben 7. Dezember 2015 Autor Melden Teilen Geschrieben 7. Dezember 2015 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 :) Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 7. Dezember 2015 Melden Teilen Geschrieben 7. Dezember 2015 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). Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.