0

Ich abzufragen meine Datenbank aus einer .NET-Anwendung (Zeit umcodieren). Ich sende den Windows-Benutzernamen an die Datenbank und frage ihn abhängig von diesen Informationen ab.Wie erstellt man eine Tabelle, die temporär existiert und auf die von vielen gespeicherten Prozeduren zugegriffen werden kann?

Ich frage viele verschiedene Informationen mit gespeicherten Prozeduren wie Urlaub, Überstunden etc. ab und sende sie zurück an die .NET-Anwendung, wo ich diese Daten in einem Formular zeige.

Lassen Sie uns sagen, dass ich die Informationen von SP1 benötigen, 3 und 4 auf Form1:

FORM1:

SP1 
SP3 
SP4 

Mein Problem:

Ich habe eine ziemlich komplizierte Tabelle, die ich brauche für diese gespeicherten Prozeduren. Im Moment erstelle ich diese Tabelle in jeder dieser gespeicherten Prozeduren als temporäre Tabellen, was offensichtlich ziemlich zeitaufwendig ist.

Was ich bisher versucht habe, ist eine gespeicherte Prozedur zu erstellen, die eine temporäre Tabelle erstellt, aber diese ist nicht zugänglich in meinen anderen gespeicherten Prozeduren.

Meine Frage: Ich suche nach einer Möglichkeit, diese Tabelle für Form1 einmal zu erstellen, damit ich nur auf diese Tabelle in den anderen gespeicherten Prozeduren zugreifen kann.

Ich verwende SQL Server 2014 Express.

+2

Verwenden Sie eine permanente Tabelle oder eine globale temporäre Tabelle. –

Antwort

2

erstellen Wenn Sie die temporäre Tabelle außerhalb jeder gespeicherte Prozedur erstellen, wird es in jedem zugänglich sein. Unter der Annahme, dass die tatsächliche Tabellendefinition nicht zu komplex ist (aber das Popup-Ergebnis möglicherweise erfüllt), ist dies möglicherweise machbar.

So würden Sie (effektiv) ausführen:

CREATE TABLE #T (A int not null, B varchar(17) not null) 
EXEC PopulateTempTable 
EXEC SP1 
EXEC SP3 
EXEC SP4 

alle auf einer einzigen Verbindung. PopulateTempTable ist möglicherweise erforderlich oder nicht erforderlich, abhängig davon, wie komplex die Population der Tabelle ist und ob dies von Ihrem aufrufenden Code oder der Datenbank ausgeführt werden soll.

Sie können die temporäre Tabelle nicht innerhalb einer gespeicherten Prozedur erstellen, da temporäre Tabellen automatisch gelöscht werden, wenn der Bereich einer gespeicherten Prozedur beendet wird.

Alternativ können Sie "Session-globale" temporäre Tabellen simulieren, wie ich vorschlagen in this answer .

Das Risiko bei der Verwendung einer global temp table ist, dass es wirklich global ist - alle Sitzungen sehen und interagieren mit den Daten in der gleichen Tabelle. Sie müssen in solchen Umständen sehr vorsichtig sein, wenn es möglich ist, dass zwei Sitzungen versuchen, es gleichzeitig zu verwenden; Sie benötigen in der Regel einige Mittel, um die Daten in der Tabelle so zu filtern, dass jede Sitzung nur mit ihren eigenen Daten arbeitet.


Wahrscheinlich in diesen Tagen verbessert, indem auch ein Logon Trigger Hinzufügen der alten Inhalt der Tabelle löschen nach unten, wenn eine neue Verbindung aufgebaut wird.

1

Sie haben globale temporäre Tabelle

CREATE TABLE ##TEMP1 
(
    Name varchar(50) 
) 
+1

Sie könnten zumindest erwähnen, dass dies riskant ist, wenn mehr als ein Benutzer gleichzeitig vorhanden ist, und vielleicht einige Strategien vorschlagen, um das Risiko zu mindern (z. B. eine SPID-Spalte in dieser Tabelle) –

+0

Guter Vorschlag, deine Antwort gib mehr clearance –

+0

Danke für den Kommentar Damien, da mehr als ein User gleichzeitig ein relevantes Szenario für mich ist. – ruedi

Verwandte Themen