2016-07-06 4 views
1

Für die Tabellenwertfunktionen in SQL Server, wenn man etwas wie folgt ausführt, erstellt es nur die temporäre Tabelle @Table, genau wie bei den Variablen (in skalarwertigen Funktionen), richtig? Treten Probleme auf, wenn viele solcher Aussagen ausgeführt werden?Tabellenwertfunktion in SQL Server; Die Tabelle in der Funktion ist temporär?

CREATE FUNCTION some_function 
    (@some_var varchar(20), @someDate date) 
RETURNS @Table Table (id int, name varchar(50), DoB date) 
AS 
BEGIN 
    INSERT INTO @Table 
     SELECT id, Name, CAST(DoB as date) 
     FROM tblEmployees 

    RETURN 
END 
+0

Dies ist keine temporäre Tabelle, es ist nur eine Variable. In diesem Beispiel brauchen Sie es nicht einmal. Sie können eine Inline-Funktion erstellen und die Ergebnisse direkt zurückgeben. Dies würde es dem Optimierer ermöglichen, einen besseren Plan zu erstellen * und * das Kopieren der Daten in die Variable zuerst zu speichern, bevor sie zurückgegeben wird. –

+0

Bitte lesen Sie diese Antwort auf DBA.SE ... http: //dba.stackexchange.com/questions/16385/ whats-the-difference-zwischen-a-temp-table-und-table-variable-in-sql-server – TheGameiswar

+0

Sehen Sie hier https://blogs.msdn.microsoft.com/naga/2015/05/10/sql -server-performance-tuning-table-variable-vs-temporary-tables/ –

Antwort

1

Würden irgendwelche Probleme entstehen, wenn viele solcher Anweisungen ausgeführt werden sollten?

Nein, das ist not possible:

Der Umfang einer lokalen Variablen ist der Ansatz, in dem sie deklariert wird.

Der Gültigkeitsbereich der Tabellenvariablen ist der gleiche wie der der skalaren Variablen.

About table variable und temporäre Tabelle, kurz:

Der Umfang einer Tabelle Variable beschränkt sich auf die spezifische Charge, während eine lokale temporäre Tabelle auf den spezifischen spid begrenzt ist.

Das bedeutet, auch wenn Sie denselben Code aus mehreren Threads ausgeführt werden - sie werden nicht auf # Tabellennamen in Konflikt geraten, da jeder Thread eigene spid haben. Unterschiedliche Benutzer (unterschiedliche Verbindungen) können weder auf temporäre Tabellennamen (nicht gegen verschiedene Verbindungen möglich) noch auf Tabellenvariablennamen (nicht möglich) einen Konflikt verursachen.

Nur Konflikte unter ## (globale temporäre Tabellen) und # innerhalb derselben Verbindung (z. B. verschachtelte Prozeduren, die versuchen, eine temporäre Tabelle mit demselben Namen zu erstellen) sind möglich.

Verwandte Themen