/ / Umfang der temporären Tabellen in SQL Server - SQL, SQL-Server, TSQL, SQL-Server-2012

Umfang der temporären Tabellen in SQL Server - SQL, SQL-Server, TSQL, SQL-Server-2012

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 mit dem Transformationsschritt zu helfen, benutze ichtemporä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?
  • Muss jeder anrufen EXEC Neuen Geltungsbereich erstellen?

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

Antworten:

45 für die Antwort № 1

Von CREATE TABLE:

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

und noch wichtiger):

Wenn eine lokale temporäre Tabelle in einem gespeicherten erstellt wirdProzedur oder Anwendung, 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. 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.


Es gibt auch keine Notwendigkeit DROP TABLE am Ende Ihres Vorgangs (erneut über denselben Link):

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


22 für die Antwort № 2

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


17 für die Antwort № 3

Eine Sitzung kann die temporären Tabellen einer anderen Sitzung nicht sehen. Daher wirken sich unterschiedliche Importe nicht gegenseitig aus, 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.


-1 für die Antwort № 4

Ich habe nur ein paar Stunden damit verbracht, es herauszufindenwarum sich eine temporäre Tabelle, die in einem Trigger verwendet wird, merkwürdig verhielt. 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 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