it-swarm.com.de

Bereich temporärer Tabellen in SQL Server

Ich habe eine gespeicherte Prozedur zum Importieren und Transformieren von Daten von einer Datenbank in eine andere geschrieben. Bei jedem Import wird eine einzelne Firmen-ID verwendet, um alle Daten zu importieren, die sich auf diese Firma beziehen.

Um den Transformationsschritt zu unterstützen, verwende ich temporäre Tabellen. Im Rahmen der Skriptüberprüfung wurde mir empfohlen, Tabellenvariablen anstelle von temporären Tabellen zu verwenden. Der Prüfer behauptet, dass die temporäre Tabelle gemeinsam genutzt würde und den Import beschädigen würde, wenn zwei verschiedene Importe gleichzeitig ausgeführt würden.


Fragen:

  • Stimmt es, dass die temporäre Tabelle gemeinsam genutzt wird, wenn zwei verschiedene Importe gleichzeitig ausgeführt werden?
  • Erstellt jeder Aufruf von EXEC einen neuen Bereich?

Hier ist ein ausgedachtes Beispiel des Skripts.

CREATE PROC [dbo].[ImportCompany]
(
    @CompanyId AS INTEGER
)
AS
EXEC [dbo].[ImportAddress] @CompanyId = @CompanyId 
--Import other data

CREATE PROC [dbo].[ImportAddress]
(
    @CompanyId AS INTEGER
)
AS
    CREATE TABLE #Companies (OldAddress NVARCHAR(128), NewAddress NVARCHAR(128))
    INSERT INTO #Companies(OldAddress, NewAddress)
    SELECT
        Address as OldAddress,
        'Transformed ' + Address as NewAddress
    FROM
        [OldDb].[dbo].[Addresses]
    WHERE
        CompanyId = @CompanyId

    --Do stuff with the transformed data

    DROP TABLE #Companies

EXEC [dbo].[ImportCompany] @CompanyId = 12345
42
Cogslave

Von CREATE TABLE :

Lokale temporäre Tabellen sind nur in der aktuellen Sitzung sichtbar

und noch wichtiger):

Wenn eine lokale temporäre Tabelle in einer gespeicherten Prozedur oder Anwendung erstellt wird, die von mehreren Benutzern gleichzeitig ausgeführt werden kann, muss das Datenbankmodul in der Lage sein, die von den verschiedenen Benutzern erstellten Tabellen zu unterscheiden [ sic - mit ziemlicher Sicherheit sollte dies sagen, dass Sitzungen keine Benutzer sind] . Das Datenbankmodul fügt dazu jedem lokalen temporären Tabellennamen intern ein numerisches Suffix hinzu.

Womit genau widerlegt wird, wer immer gesagt hat, dass sie geteilt werden.


Auch gibt es keine Notwendigkeit, DROP TABLE am Ende Ihres Verfahrens (erneut über denselben Link):

Eine in einer gespeicherten Prozedur erstellte lokale temporäre Tabelle wird nach Abschluss der gespeicherten Prozedur automatisch gelöscht

53

## wird für globale temporäre Tabellen verwendet - steht den verschiedenen Importen zur Verfügung.

# wird für lokale temporäre Tabellen verwendet und ist nur im aktuellen/inneren Bereich verfügbar.

34
Darren

Eine Sitzung kann die temporären Tabellen einer anderen Sitzung nicht sehen. Verschiedene Importe beeinflussen sich also nicht gegenseitig, unabhängig davon, ob Sie temporäre Tabellen oder Tabellenvariablen verwenden.

Die Ausnahme bilden globale temporäre Tabellen, die mit ## Beginnen. Diese sind für alle Verbindungen sichtbar.

19
Andomar

Ich habe nur ein paar Stunden damit verbracht herauszufinden, warum sich ein temporärer Tisch, der in einem Abzug verwendet wird, seltsam verhält. Dann wurde mir klar, dass die temporäre Tabelle denselben Namen wie eine temporäre Tabelle in der gespeicherten Prozedur hatte, die zum Einfügen der Daten verwendet wurde, die den Auslöser ausgelöst haben. Ich bin mir jetzt bewusst, dass dies für mich sofort offensichtlich gewesen sein sollte, aber es war ein typischer Fall, die offensichtlichste Ursache zu übersehen, wenn ich herausfinden wollte, warum etwas keinen Sinn ergab.

Es ist daher wichtig, sich daran zu erinnern, dass, wenn ein gespeicherter Prozess einen anderen gespeicherten Prozess aufruft oder einen Trigger auslöst, temporäre Tabellennamen über diese hinweg eindeutig sein müssen, um unerwünschte Nebenwirkungen zu vermeiden.

Außerdem - selbst wenn der folgende Code im inneren gespeicherten Prozess ausgeführt wird, funktioniert er nicht wie erwartet. Da der äußere gespeicherte Prozess den temporären Tabellennamen zu sperren scheint.

IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL
    DROP TABLE #TempTable
3
Nel Prinsloo